DIRECTORY Core, CoreClasses, CoreCreate, CoreFlat, Ports, Rosemary, RosemaryUser, SmallCacheLogic, SCParms, Sisyph; SmallCacheBWdWtPipeImpl: CEDAR PROGRAM IMPORTS CoreClasses, CoreCreate, CoreFlat, Ports, Rosemary, SCParms, Sisyph EXPORTS SmallCacheLogic ~ BEGIN OPEN SmallCacheLogic; InternalState: TYPE = RECORD [ en: ARRAY [0..3] OF Level, a, b, c: LevelSequence ]; State: TYPE = REF StateRec; StateRec: TYPE = RECORD [ master: InternalState, slave: InternalState ]; EnBWdWtPipe, RplyData, D, Q, Clock: NAT; BWdWtPipe : PUBLIC PROC [cts: CellTypeSpec, cx: Context] RETURNS [ct: CellType] = { public: Wire _ CoreCreate.WireList[LIST[CoreCreate.Seq["RplyData", SCParms.numBitsPerWord], CoreCreate.Seq["D", SCParms.numBitsPerWord], CoreCreate.Seq["Q", SCParms.numBitsPerWord], "EnBWdWtPipe", "Clock"]]; SELECT cts FROM Schematic => ct _ Sisyph.ES["BWdWtPipe.sch", cx]; Procedure => { ct _ CoreClasses.CreateUnspecified[public: public]; [] _ Rosemary.BindCellType[cellType: ct, roseClassName: bWdWtPipeName]; [] _ CoreFlat.CellTypeCutLabels[ct, "Logic"]; Ports.InitPorts[ct, ls, none, "D"]; Ports.InitPorts[ct, l, none, "EnBWdWtPipe", "Clock"]; Ports.InitPorts[ct, ls, drive, "RplyData"]; Ports.InitPorts[ct, ls, drive, "Q"] }; CoreFile => ERROR ENDCASE => ERROR }; Init: Rosemary.InitProc = { s: State; IF oldStateAny=NIL THEN { s _ NEW [StateRec]; s.master.a _ NEW [LevelSequenceRec[SCParms.numBitsPerWord]]; s.master.b _ NEW [LevelSequenceRec[SCParms.numBitsPerWord]]; s.master.c _ NEW [LevelSequenceRec[SCParms.numBitsPerWord]]; s.slave.a _ NEW [LevelSequenceRec[SCParms.numBitsPerWord]]; s.slave.b _ NEW [LevelSequenceRec[SCParms.numBitsPerWord]]; s.slave.c _ NEW [LevelSequenceRec[SCParms.numBitsPerWord]]; } ELSE s _ NARROW [oldStateAny, State]; FOR i : INT IN [0..3] DO s.master.en[i] _ X; s.slave.en[i] _ X; ENDLOOP; Ports.SetLS[s.master.a, X]; Ports.SetLS[s.master.b, X]; Ports.SetLS[s.master.c, X]; Ports.SetLS[s.slave.a, X]; Ports.SetLS[s.slave.b, X]; Ports.SetLS[s.slave.c, X]; [EnBWdWtPipe, RplyData, D, Q, Clock] _ Ports.PortIndexes[cellType.public, "EnBWdWtPipe", "RplyData", "D", "Q", "Clock"]; stateAny _ s; }; Simple: Rosemary.EvalProc = { s: State _ NARROW[stateAny]; IF NOT clockEval THEN SELECT p[Clock].l FROM L => { s.master.en[3] _ s.slave.en[2]; s.master.en[2] _ s.slave.en[1]; s.master.en[1] _ s.slave.en[0]; s.master.en[0] _ p[EnBWdWtPipe].l; IF p[EnBWdWtPipe].l=H THEN Ports.CopyLS[p[D].ls, s.master.a]; IF s.slave.en[1]=H THEN Ports.CopyLS[s.slave.a, s.master.b]; IF s.slave.en[3]=H THEN Ports.CopyLS[s.slave.b, s.master.c]; }; H => { FOR i: NAT IN [0..3] DO s.slave.en[i] _ s.master.en[i] ENDLOOP; Ports.CopyLS[s.master.a, s.slave.a]; Ports.CopyLS[s.master.b, s.slave.b]; Ports.CopyLS[s.master.c, s.slave.c]; }; X => { FOR i: NAT IN [0..3] DO s.slave.en[i] _ s.master.en[i] ENDLOOP; Ports.SetLS[s.master.a, X]; Ports.SetLS[s.master.b, X]; Ports.SetLS[s.master.c, X]; Ports.SetLS[s.slave.a, X]; Ports.SetLS[s.slave.b, X]; Ports.SetLS[s.slave.c, X]; }; ENDCASE => ERROR; Ports.CopyLS[s.slave.a, p[RplyData].ls]; Ports.CopyLS[s.slave.c, p[Q].ls]; }; bWdWtPipeName: ROPE = Rosemary.Register[roseClassName: "SmallCacheBWdWtPipe", init: Init, evalSimple: Simple, scheduleIfClockEval: TRUE]; END. ΚSmallCacheBWdWtPipeImpl.mesa Pradeep Sindhu April 26, 1988 12:50:06 pm PDT Paraminder Sahai September 23, 1987 11:48:36 pm PDT Constants and Type Defs Signal Defs Public Procs Internal Procs Κy˜šœ™Icode™-K™3J™—J™šΟk ˜ Kšœi˜i—J™KšΡblnœœ˜&KšœD˜KKšœ˜Kšœ œ˜headšΟl™K˜šœœœ˜Kšœœœ˜Kšœ˜K˜—Kšœœœ ˜šœ œœ˜Kšœ˜Kšœ˜Kšœ˜——šŸ ™ Kšœ#œ˜(—šŸ ™ šž œœœ"œ˜SKšœ#œ¨˜ΟK˜šœ˜Kšœœ˜1šœ˜Kšœ4˜4KšœG˜GKšœ-˜-Kšœ#˜#Kšœ5˜5Kšœ+˜+Kšœ#˜#K˜—Kšœ ˜Kšœ˜—Kšœ˜K˜——šŸ™šžœ˜Kšœ ˜ K˜šœ ˜šœ˜Kšœœ ˜Kšœ œ+˜