<> <> <> <<>> DIRECTORY CCDUtils, CDOrient, Core, CoreBlock, CoreFrame, CoreGlue, CoreName, CoreXform, IFUSrc, IFUCoreCtl, IFUCoreData, IFUCoreDrive, PLAOps, Rope; IFUSrcStackControler: CEDAR PROGRAM IMPORTS CCDUtils, CoreFrame, CoreGlue, CoreName, CoreXform, IFUCoreData, IFUCoreCtl, IFUCoreDrive, PLAOps, Rope EXPORTS IFUSrc = BEGIN ROPE: TYPE = Core.ROPE; GND: ROPE = CoreName.RopeNm["GND"]; VDD: ROPE = CoreName.RopeNm["VDD"]; one: ROPE = "( GND GND GND GND VDD )"; xform: CoreXform.Xform _ CoreXform.GenXform[LIST[ [5, 0] ]]; Signal: SIGNAL = CODE; LtArgForm: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "Mux", name: "LtArgForm", top: NIL, right: "( StackAdjTosAB NotStackAdjTosAB )", in: "( TosBA. BosBA. )", out: "( LtArg. )", bot: SwitchInAddendTop, xform: xform ]}; SwitchInAddendTop: ROPE = "( TosBA. BosBA. NIL NIL LtArg. )"; SwitchInAddend: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "SwitchBox", name: "SwitchInAddend", top: SwitchInAddendTop, right: "( StackAddendIsOnesAB )", bot: AdderTop, xform: xform ]}; AdderTop: ROPE = "( TosBA. BosBA. NIL NIL LtArg. StackAddendIsOnesAB )"; Adder: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "GPRow", name: "Adder", type: "DpAdderSerial", top: AdderTop, in: "( LtArg. StackAddendIsOnesAB (StackCryAB.1 StackCryAB.2 StackCryAB.3 StackCryAB.4 StackCarryIsOneAB) )", out: "( Sum. NIL (NIL StackCryAB.1 StackCryAB.2 StackCryAB.3 StackCryAB.4) )", bot: PreTosMuxTop, xform: xform ]}; PreTosMuxTop: ROPE = "( TosBA. BosBA. NIL NIL Sum. )"; PreTosMux: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "Mux", name: "PreTosMux", top: PreTosMuxTop, right: "( StackAdjTosAB NotStackAdjTosAB )", in: "( Sum. TosBA. )", out: "( PreTosA. )", bot: PreBosMuxTop, xform: xform ]}; PreBosMuxTop: ROPE = "(TosBA. BosBA. NIL NIL Sum. NIL GND VDD PreTosA. NIL )"; PreBosMux: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "Mux", name: "PreBosMux", top: PreBosMuxTop, right: "( StackAdjTosAB NotStackAdjTosAB )", in: "( BosBA. Sum. )", out: "( PreBosA. )", bot: TosMuxTop, xform: xform ]}; TosMuxTop: ROPE = "(TosBA. BosBA. NIL NIL NIL NIL GND VDD PreTosA. PreBosA. )"; TosMux: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "Mux", name: "TosMux", top: TosMuxTop, right: "( ResetBA NotResetBA )", in: "( GND PreTosA. )", out: "( TosA. )", bot: BosMuxTop, xform: xform ]}; BosMuxTop: ROPE = "( TosBA. BosBA. NIL NIL TosA. NIL GND VDD NIL PreBosA. )"; BosMux: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "Mux", name: "BosMux", top: BosMuxTop, right: "( ResetBA NotResetBA )", in: LIST[one, "PreBosA."], out: "( BosA. )", bot: TosLatchATop, xform: xform ]}; TosLatchATop: ROPE = "( TosBA. BosBA. NIL NIL TosA. BosA. )"; TosLatchA: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "GPRow", name: "TosLatchA", type: "DpLatch", top: TosLatchATop, right: "( PhA VBB )", in: "( TosA. )", out: "( TosAB. )", bot: BosLatchATop, xform: xform ]}; BosLatchATop: ROPE = "( TosBA. BosBA. TosAB. NIL NIL BosA. )"; BosLatchA: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "GPRow", name: "BosLatchA", type: "DpLatch", top: BosLatchATop, right: "( PhA VBB )", in: "( BosA. )", out: "( BosAB. )", bot: BosInvTop, xform: xform ]}; BosInvTop: ROPE = "( TosBA. BosBA. TosAB. BosAB. )"; BosInv: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "GPRow", name: "BosInv", type: "DpInv", top: BosInvTop, in: "( BosAB. )", out: "( InvBosB. )", bot: DiffTop, xform: xform ]}; DiffTop: ROPE = "( TosBA. BosBA. TosAB. BosAB. InvBosB. )"; Diff: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "GPRow", name: "Diff", type: "DpAdderSerial", top: DiffTop, in: "( TosAB. InvBosB. (StackDiffCry.1 StackDiffCry.2 StackDiffCry.3 StackDiffCry.4 VDD) )", out: "( DiffB. NIL (NIL StackDiffCry.1 StackDiffCry.2 StackDiffCry.3 StackDiffCry.4) )", bot: DiffLatchBTop, xform: xform ]}; DiffLatchBTop: ROPE = "( TosBA. BosBA. TosAB. BosAB. DiffB. )"; DiffLatchB: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "GPRow", name: "DiffLatchB", type: "DpLatch", top: DiffLatchBTop, right: "( PhB VBB )", in: "( DiffB. )", out: "( StackDiffBA. )", bot: TosLatchBTop, xform: xform ]}; TosLatchBTop: ROPE = "( TosBA. BosBA. TosAB. BosAB. StackDiffBA. )"; TosLatchB: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "GPRow", name: "TosLatchB", type: "DpLatch", top: TosLatchBTop, right: "( PhB VBB )", in: "( TosAB. )", out: "( TosBA. )", bot: BosLatchBTop, xform: xform ]}; BosLatchBTop: ROPE = "( TosBA. BosBA. NIL BosAB. StackDiffBA. )"; BosLatchB: PROC RETURNS[cellType: Core.CellType] = { cellType _ IFUCoreData.CellProc[ subClass: "GPRow", name: "BosLatchB", type: "DpLatch", top: BosLatchBTop, right: "( PhB VBB )", in: "( BosAB. )", out: "( BosBA. )", bot: BosLatchBBot, xform: xform ]}; BosLatchBBot: ROPE = "( TosBA. BosBA. NIL NIL StackDiffBA. )"; StackIndexingData: PROC RETURNS [cellType: Core.CellType] = { name: ROPE _ CoreName.RopeNm["IFUStackIndexingData"]; IF (cellType _ CoreFrame.ReadFrameCache[name])=NIL THEN { leftRouting: Core.CellType _ CoreGlue.ChanSideCell [side: left, layer: CCDUtils.cmosMet, list: LIST["GND/50", "VDD/50"] ]; cellType _ CoreFrame.NewFrameCells[ name: name, rec: [first: top, orient: CDOrient.rotate90], cells: LIST[ LtArgForm[], SwitchInAddend[], Adder[], PreTosMux[], PreBosMux[], TosMux[], BosMux[], TosLatchA[], BosLatchA[], BosInv[], Diff[], DiffLatchB[], TosLatchB[], BosLatchB[] ] ]; cellType _ CoreFrame.NewFrameCells[name: name, rec: [first: top], cells: LIST[ CoreGlue.CellProc[l: chan, b: conn, r: sum, lCell: leftRouting], cellType ]]; CoreFrame.WriteFrameCache[cellType]} }; StackIndexing: PUBLIC PROC RETURNS[cellType: Core.CellType] = { cellType _ CoreFrame.NewFrameCells[ name: "StackIndexXFill", rec: [first: left], cells: LIST[ CoreGlue.CellProc[l: ext, r: conn], StackIndexingData[] ]] }; StackControler: PUBLIC PROC [sIn: ROPE, altOut: ROPE _ NIL] RETURNS [cellType: Core.CellType, sOut: ROPE] = { name: ROPE _ CoreName.RopeNm["IFUStackControler"]; IF altOut#NIL THEN Signal[]; IF (cellType _ CoreFrame.ReadFrameCache[name])=NIL THEN { PLAD: TYPE = IFUCoreCtl.PLADescriptionRec; StackSection: TYPE = {bCnt, aCnt, decRd, decL, decP }; plaDscs: ARRAY StackSection OF REF PLAD _ [ decP: NEW[PLAD _ [name: "IFUPLAStackDecodeWtP", plaPhs: [BA, B, BAA, B, Ac] ]], decL: NEW[PLAD _ [name: "IFUPLAStackDecodeWtL", plaPhs: [BA, B, BAA, B, Ac] ]], decRd: NEW[PLAD _ [name: "IFUPLAStackDecodeRd", plaPhs: [BA, B, BAA, B, Ac] ]], aCnt: NEW[PLAD _ [name: "IFUPLAStackAControl", plaPhs: [BA, B, BAA, A, AB] ]], bCnt: NEW[PLAD _ [name: "IFUPLAStackBControl", plaPhs: [AB, B, BAA, B, BA] ]] ]; sOut _ sIn; plaDscs[bCnt].plaType _ hot; plaDscs[aCnt].plaType _ hot; plaDscs[decP].plaType _ hot; plaDscs[decL].plaType _ hot; plaDscs[decRd].plaType _ hot; plaDscs[decP].nofOrCols _ 16; plaDscs[decL].nofOrCols _ 16; plaDscs[decRd].nofOrCols _ 16; plaDscs[decP].capSides _ top; plaDscs[decL].capSides _ none; plaDscs[decRd].capSides _ none; FOR index: StackSection IN StackSection DO OPEN DR: IFUCoreDrive; dr: IFUCoreDrive.Drive; plaDscs[index].ttt _ PLAOps.ReadPLAFile[plaDscs[index].name.Cat[".ttt"]]; plaDscs[index].inSh _ sOut; plaDscs[index].includeIns _ index#decP AND index#decL; IFUCoreCtl.MakePLA1[plaDscs[index]]; IF index=aCnt THEN { dr _ DR.FindDrive[plaDscs[aCnt].outDrs, "StackAdjTosAB"]; dr.dualOut _ TRUE}; IF index=bCnt THEN { dr _ DR.FindDrive[plaDscs[bCnt].inDrs, "StackDiffAB.0"]; dr.in.ph _ BA; dr _ DR.FindDrive[plaDscs[bCnt].inDrs, "StackDiffAB.1"]; dr.in.ph _ BA; dr _ DR.FindDrive[plaDscs[bCnt].inDrs, "StackDiffAB.2"]; dr.in.ph _ BA; dr _ DR.FindDrive[plaDscs[bCnt].inDrs, "StackDiffAB.3"]; dr.in.ph _ BA; dr _ DR.FindDrive[plaDscs[bCnt].inDrs, "StackDiffAB.4"]; dr.in.ph _ BA; dr _ DR.FindDrive[plaDscs[bCnt].outDrs, "Push3BA"]; dr.dualOut _ TRUE}; IFUCoreCtl.MakePLA2[plaDscs[index]]; sOut _ plaDscs[index].outSh; ENDLOOP; cellType _ CoreFrame.NewFrameCells[name: name, rec:[first: top], cells:LIST[ CoreFrame.NewFrameCells[ name: "StackDecoder", rec: [first: left], cells: LIST[ CoreGlue.CellProc[l: ext, r: conn], IFUCoreCtl.CellProc[ outSec, plaDscs[ decP ]] ]], CoreFrame.NewFrameCells[ name: "StackDecoder", rec: [first: left], cells: LIST[ CoreGlue.CellProc[l: ext, r: conn], IFUCoreCtl.CellProc[ outSec, plaDscs[ decL ]] ]], CoreFrame.NewFrameCells[ name: "StackDecoder", rec: [first: left], cells: LIST[ CoreGlue.CellProc[l: ext, r: conn], IFUCoreCtl.CellProc[ complete, plaDscs[ decRd ]] ]], CoreFrame.NewFrameCells[ name: "StackAControler", rec: [first: left], cells: LIST[ CoreGlue.CellProc[l: ext, r: conn], IFUCoreCtl.CellProc[ complete, plaDscs[ aCnt ]] ]], CoreFrame.NewFrameCells[ name: "StackBControler", rec: [first: left], cells: LIST[ CoreGlue.CellProc[l: ext, r: conn], IFUCoreCtl.CellProc[ complete, plaDscs[ bCnt ]] ]] ]]; IFUCoreDrive.SetDShiftIO[cellType, sIn, sOut]; CoreFrame.WriteFrameCache[cellType]}; [sIn, sOut] _ IFUCoreDrive.GetDShiftIO[cellType]; cellType _ CoreFrame.NewFrameCells[ name: "StackControlerFillX", rec: [first: left], cells: LIST[ CoreGlue.CellProc[l: ext, r: conn], cellType ]]}; <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <<>> END. <<>> <<>>