<> <> <> <> DIRECTORY Boole, BooleCore, CoreCreate, EU2RamControl, EU2LeafUtils, EU2Utils, PW; EU2RamControlImpl: CEDAR PROGRAM IMPORTS Boole, BooleCore, CoreCreate, EU2LeafUtils, EU2Utils, PW EXPORTS EU2RamControl = BEGIN OPEN Boole, BooleCore, CoreCreate, EU2RamControl, EU2Utils; -- To be generated by Alps (Ave, Serlet, programatori te salutant!) CreateRamControl: PUBLIC PROC RETURNS [cellType: CellType] = { inDriver: CellType _ EU2LeafUtils.AlpsExtract["InputDriver.sch"]; outClkDriver: CellType _ EU2LeafUtils.AlpsExtract["ClockedOutputDriver.sch"]; inputDrivers: Inputs _ NIL; outputDrivers: Outputs _ NIL; outputDriver: OutputRec; expr: Expression _ NIL; public: Wire _ Union[GenPGnEWires[], GenWiresCtrlToRam[], GenWiresRamToCtrl[], Wires["reject", "nPhA"]]; ramAdr: Wire _ FindWire[public, "ramAdr"]; reject: Expression _ WireVar[public, "reject"]; nReject: Expression _ Not[reject]; aHi: Wire _ ramAdr[a][hi]; bHi: Wire _ ramAdr[b][hi]; cHi: Wire _ ramAdr[c][hi]; aLow: Wire _ ramAdr[a][low]; bLow: Wire _ ramAdr[b][low]; cLow: Wire _ ramAdr[c][low]; cAdr: Wire _ ramAdr[c]; <<>> <<-- Input inverters to the Alps blocks (25 pieces)>> <<-- ramAdr[aAdrH, bAdrH, cAdrH, aAdrL, bAdrL, cAdrL] and reject>> FOR i: INT IN [0..sizeAdrH) DO inputDrivers _ CONS[[input: Index[aHi, i], driver: inDriver], inputDrivers]; inputDrivers _ CONS[[input: Index[bHi, i], driver: inDriver], inputDrivers]; inputDrivers _ CONS[[input: Index[cHi, i], driver: inDriver], inputDrivers]; ENDLOOP; FOR i: INT IN [0..sizeAdrL) DO inputDrivers _ CONS[[input: Index[aLow, i], driver: inDriver], inputDrivers]; inputDrivers _ CONS[[input: Index[bLow, i], driver: inDriver], inputDrivers]; inputDrivers _ CONS[[input: Index[cLow, i], driver: inDriver], inputDrivers]; ENDLOOP; inputDrivers _ CONS[[input: "reject", driver: inDriver], inputDrivers]; <<-- Enable Write on the KBus (IFU side) >> outputDriver _ [driver: outClkDriver, pas: LIST[["Clock", "nPhA"]], output: "enWrtIFU", expr: EqualInt[public, cAdr, IFUAdr]]; outputDrivers _ CONS[outputDriver, outputDrivers]; <<>> <<-- Precharge of the RAM: follows nPhB, so it gets PhB >> <> <> <> <> <<>> <<-- Output drivers, all of the same type: they follow PhA, so they get nPhA;>> FOR i: INT IN [0..nRows) DO <<-- selHi[i][a] _ aAdrH=i>> outputDriver _ [driver: outClkDriver, pas: LIST[["Clock", "nPhA"]], output: Index["selA", i], expr: EqualInt[public, aHi, i]]; outputDrivers _ CONS[outputDriver, outputDrivers]; <<-- selHi[i][b] _ bAdrH=i>> outputDriver _ [driver: outClkDriver, pas: LIST[["Clock", "nPhA"]], output: Index["selB", i], expr: EqualInt[public, bHi, i]]; outputDrivers _ CONS[outputDriver, outputDrivers]; <<-- selHi[i][c] _ (cAdrH=i).~reject for i#marAdr/4>> <<-- selHi[marAdr/4][c] _ (cAdrH=i)+reject>> expr _ IF i=marAdr/4 THEN Or[reject, EqualInt[public, cHi, i]] ELSE And[nReject, EqualInt[public, cHi, i]]; outputDriver _ [driver: outClkDriver, pas: LIST[["Clock", "nPhA"]], output: Index["selC", i], expr: expr]; outputDrivers _ CONS[outputDriver, outputDrivers]; ENDLOOP; FOR i: INT IN [0..sizeSelLow) DO <<-- selLow[i][a] _ aAdrL=i>> outputDriver _ [driver: outClkDriver, pas: LIST[["Clock", "nPhA"]], output: Index["selALow", i], expr: EqualInt[public, aLow, i]]; outputDrivers _ CONS[outputDriver, outputDrivers]; <<-- selLow[i][b] _ bAdrL=i>> outputDriver _ [driver: outClkDriver, pas: LIST[["Clock", "nPhA"]], output: Index["selBLow", i], expr: EqualInt[public, bLow, i]]; outputDrivers _ CONS[outputDriver, outputDrivers]; <<-- selLow[i][c] _ (cAdrL=i).~reject for i#marAdr MOD 4>> <<-- selHi[marAdr MOD 4][c] _ (cAdrL=i)+reject>> expr _ IF i=marAdr MOD 4 THEN Or[reject, EqualInt[public, cLow, i]] ELSE And[nReject, EqualInt[public, cLow, i]]; outputDriver _ [driver: outClkDriver, pas: LIST[["Clock", "nPhA"]], output: Index["selCLow", i], expr: expr]; outputDrivers _ CONS[outputDriver, outputDrivers]; ENDLOOP; <<>> cellType _ AlpsCell[ name: "RamControl", public: public, inputs: inputDrivers, outputs: outputDrivers, fillerOutputDriver: PW.Get[EU2LeafUtils.eu2Design, "FillerOutputDriver.mask"], fillerCornerDriver: PW.Get[EU2LeafUtils.eu2Design, "FillerCornerDriver.mask"] ]; }; END. << TO DO>> <<>> <<-- nPrech>>