IFUAsmLSForm.mesa
Copyright c 1985 by Xerox Corporation. All rights reserved.
Last Edited by July 7, 1985 9:33:04 am PDT
Curry, December 15, 1985 4:53:36 pm PST
DIRECTORY
CD,
Commander,
IFUAsm,
IFUPW,
Rope;
IFUAsmLSForm: CEDAR PROGRAM
IMPORTS Commander, IFUAsm, IFUPW
EXPORTS IFUAsm =
BEGIN
List: TYPE = IFUPW.List;
GND: Rope.ROPE = IFUPW.GND;
VDD: Rope.ROPE = IFUPW.VDD;
lsFormRP: IFUPW.RowParams = IFUPW.IFUDataColNSeq;
List4:  PROC [r0, r1, r2, r3: Rope.ROPE] RETURNS[list: IFUPW.List] = IFUPW.List4;
LISTn:  PROC [r0, r1, r2, r3, r4, r5, r6, r7: REFNIL] RETURNS[list: LIST OF REF] = {RETURN[IFUPW.LISTn[r0, r1, r2, r3, r4, r5, r6, r7]]};
op47AlphaBetaBA: LIST OF REF = IFUPW.LISTn[
IFUPW.List8[GND, GND, GND, GND, "OpBA.4", "OpBA.5", "OpBA.6", "OpBA.7"],
NIL,
"AlphaBA.",
"BetaBA."];
LStackRdPreChargeTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
op47AlphaBetaBA, -- Op03 dropped here
NIL,
List4[NIL, NIL, NIL, "LStackWtDataA."],
List4[NIL, NIL, NIL, "LStackRdDataA."] ];
LStackRdPreCharge: PROC[design: CD.Design] RETURNS[cellName: CD.Object] = {
cellName ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmLSForm.LStackRdPreCharge",
type:  IFUPW.LISTn["GPPreChg"],
top:  LStackRdPreChargeTop,
leftCtl:  LIST["PhB"],
in:   NIL,
out:  IFUPW.LISTn[List4[NIL, NIL, NIL, "LStackRdDataA."]],
bot:  LStackRdMuxTop,
rp:   lsFormRP ]};
LStackRdMuxTop:   LIST OF REF = IFUPW.LISTn[
"XBus.",
op47AlphaBetaBA,
NIL,
List4[NIL, NIL, NIL, "LStackWtDataA."],
List4[NIL, NIL, NIL, "LStackRdDataA."] ];
LStackRdMux:   PROC[design: CD.Design] RETURNS[cellName: CD.Object] = {
cellName ← IFUPW.IFUMuxRow[
design: design,
name:  "IFUAsmLSForm.LStackRdMux",
top:  LStackRdMuxTop,
rightCtl:  LIST["Push3BA", "NotPush3BA"],
in:   IFUPW.LISTn[
List4[NIL, NIL, NIL, "LStackWtDataA."],
List4[NIL, NIL, NIL, "LStackRdDataA."] ],
out:  IFUPW.LISTn[List4[NIL, NIL, NIL, "SelLStackRdDataA."]],
bot:  LStackRdLatchATop,
rp:   lsFormRP ]};
LStackRdLatchATop:   LIST OF REF = IFUPW.LISTn[
"XBus.",
op47AlphaBetaBA,
NIL,
List4[NIL, NIL, NIL, "LStackWtDataA."],
NIL,
List4[NIL, NIL, NIL, "SelLStackRdDataA."]];
LStackRdLatchA:   PROC[design: CD.Design] RETURNS[cellName: CD.Object] = {
cellName ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmLSForm.LStackRdLatchA",
type:  IFUPW.LISTn["GPLatch"],
top:  LStackRdLatchATop,
leftCtl:  LIST["PhA", "VBB"],
in:   IFUPW.LISTn[List4[NIL, NIL, NIL, "SelLStackRdDataA."]],
out:  IFUPW.LISTn[List4[NIL, NIL, NIL, "LStkTopAB."]],
bot:  LStackXBusDrTop,
rp:   lsFormRP ]};
LStackXBusDrTop:   LIST OF REF = IFUPW.LISTn[
"XBus.",
op47AlphaBetaBA,
NIL,
List4[NIL, NIL, NIL, "LStackWtDataA."],
NIL,
List4[NIL, NIL, NIL, "LStkTopAB."]];
LStackXBusDr:   PROC[design: CD.Design] RETURNS[cellName: CD.Object] = {
cellName ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmLSForm.LStackXBusDr",
type:  IFUPW.LISTn["GPTriDr"],
top:  LStackXBusDrTop,
rightCtl: LIST["X1ASrcStackPBA","NotX1ASrcStackPBA"],
in:   IFUPW.LISTn[List4[NIL, NIL, NIL, "LStkTopAB."]],
out:  IFUPW.LISTn[List4[NIL, NIL, NIL, "XBus."]],
bot:  LStackWtBufTop,
rp:   lsFormRP ]};
LStackWtBufTop:   LIST OF REF = IFUPW.LISTn[
"XBus.",
op47AlphaBetaBA,
NIL,
List4[NIL, NIL, NIL, "LStackWtDataA."],
NIL,
List4[NIL, NIL, NIL, "LStkTopAB."]];
LStackWtBuf:   PROC[design: CD.Design] RETURNS[cellName: CD.Object] = {
cellName ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmLSForm.LStackWtBuf",
type:  IFUPW.LISTn["GPBuf"],
top:  LStackWtBufTop,
in:   IFUPW.LISTn[List4[NIL, NIL, NIL, "PreLStackWtDataA."]],
out:  IFUPW.LISTn[List4[NIL, NIL, NIL, "LStackWtDataA."]],
bot:  LStackWtMuxTop,
rp:   lsFormRP ]};
LStackWtMuxTop:   LIST OF REF = IFUPW.LISTn[
"XBus.",
op47AlphaBetaBA,
List4[NIL, NIL, NIL, "PreLStackWtDataA."],
NIL,
NIL,
List4[NIL, NIL, NIL, "LStkTopAB."]];
LStackWtMux:   PROC[design: CD.Design] RETURNS[cellName: CD.Object] = {
cellName ← IFUPW.IFUMuxRow[
design: design,
name:  "IFUAsmLSForm.LStackWtMux",
top:  LStackWtMuxTop,
rightCtl:  LIST["X1ADstStackBA", "NotX1ADstStackBA"],
in:   IFUPW.LISTn["XBus.", List4[NIL, NIL, NIL, "L3BA."]],
out:  IFUPW.LISTn[List4[NIL, NIL, NIL, "PreLStackWtDataA."]],
bot:  LSMuxSwitchingTop,
rp:   lsFormRP ]};
LSMuxSwitchingTop: LIST OF REF = LISTn[
"XBus.",
op47AlphaBetaBA,
NIL,
NIL,
List4[NIL, NIL, NIL, "L3BA."],
List4[NIL, NIL, NIL, "LStkTopAB."] ];
LSMuxSwitching: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "IFUAsmLSForm.LSMuxSwitching",
rowType: IFUPW.cmosMet2,
topRP: lsFormRP,
top:  LSMuxSwitchingTop,
left:  NIL,
right:  NIL,
bot:  LSArgFormMuxTop,
botRP:  lsFormRP ]};
LSArgFormMuxTop: LIST OF REF = IFUPW.LISTn[
"XBus.", 
op47AlphaBetaBA,
List4["L3BA.",  "LStkTopAB.",  NIL,    NIL],
NIL,
NIL,
NIL,
GND,
VDD,
List4[NIL,   "AlphaBA.",  NIL,    "AlphaBA."]];
LSArgFormMux: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "IFUAsmLSForm.LSArgFormMux",
top:  LSArgFormMuxTop,
rightCtl: LIST[
"LSourceLtLBA",  "LSourceLtSBA",   "LSourceLtZeroBA",  "LSourceLtL3BA",
"LSourceRtZeroBA",  "LSourceRtAlphaBA", "LSourceRtStackBA", "LSourceRtOneBA",
"SSourceLtSBA",   "SSourceLtLBA",   "SSourceLtZeroBA",  "SSourceLtS3BA",
"SSourceRtDeltaSBA", "SSourceRtAlphaBA", "SSourceRtZeroBA",  "SSourceRtOneBA"],
in:  IFUPW.LISTn[
List4["LAB.",   NIL,   NIL,  NIL],
List4["SAB.",   NIL,   NIL,  NIL],
List4[GND,   NIL,   NIL,  NIL],
List4["L3BA.",  NIL,   NIL,  NIL],
List4[NIL,   GND,   NIL,  NIL],
List4[NIL,   "AlphaBA.", NIL,  NIL],
List4[NIL,   "LStkTopAB.", NIL,  NIL],
List4[NIL,   VDD,   NIL,  NIL],
List4[NIL,   NIL,   "SAB.", NIL],
List4[NIL,   NIL,   "LAB.", NIL],
List4[NIL,   NIL,   GND,  NIL],
List4[NIL,   NIL,   "S3BA.", NIL],
List4[NIL,   NIL,   NIL,  "SDeltaB."],
List4[NIL,   NIL,   NIL,  "AlphaBA."],
List4[NIL,   NIL,   NIL,  GND],
List4[NIL,   NIL,   NIL,  VDD] ],
out:  LISTn[List4["LSumLtx.", "LSumRtx.", "SSumLtx.", "SSumRtx."]],
bot:  LSCrossConnLSABTop,
rp:   lsFormRP ]};
LSCrossConnLSABTop: LIST OF REF = LISTn[
"XBus.", 
op47AlphaBetaBA,
List4["L3BA.",  NIL,    "S3BA.",   "SDeltaB."],
List4["LSumLtx.",  "LSumRtx.",  "SSumLtx.",  "SSumRtx."],
List4["SAB.",   NIL,    "LAB.",   NIL],
List4["LAB.",   NIL,    "SAB.",   NIL] ];
LSCrossConnLSAB: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "IFUAsmLSForm.LSCrossConnLSAB",
rowType: IFUPW.cmosMet2,
topRP: lsFormRP,
top:  LSCrossConnLSABTop,
left:  NIL,
right:  NIL,
bot:  LSArgFormBufTop,
botRP:  lsFormRP ]};
LSArgFormBufTop: LIST OF REF = LISTn[
"XBus.", 
op47AlphaBetaBA,
List4["L3BA.",  NIL,    "S3BA.",   "SDeltaB."],
List4["LSumLtx.",  "LSumRtx.",  "SSumLtx.",  "SSumRtx."],
NIL,
List4["LAB.",   NIL,    "SAB.",   NIL] ];
LSArgFormBuf: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmLSForm.LSArgFormBuf",
type:   LISTn["GPBuf"],
top:  LSArgFormBufTop,
leftCtl: LIST[NIL],
in:   LISTn[List4["LSumLtx.", "LSumRtx.", "SSumLtx.", "SSumRtx."] ],
out:  LISTn[ List4["LSumLt.", "LSumRt.", "SSumLt.", "SSumRt."] ],
bot:  LSPreAdderAdjustTop,
rp:   lsFormRP ]};
LSPreAdderAdjustTop: LIST OF REF = LISTn[
"XBus.", 
op47AlphaBetaBA,
List4["L3BA.",   NIL,   "S3BA.",   "SDeltaB."],
List4["LSumLt.",  "LSumRt.",  "SSumLt.",  "SSumRt."],
NIL,
List4["LAB.",   NIL,    "SAB.",   NIL] ];
LSPreAdderAdjust: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "IFUAsmLSForm.LSPreAdderAdjust",
rowType: IFUPW.cmosMet2,
topRP: lsFormRP,
top:  LSPreAdderAdjustTop,
left:  NIL,
right:  LIST["PopSaBA", "PopSbBA", "PushScBA"],
bot:  LSAdderTop,
botRP:  lsFormRP ]};
LSAdderTop: LIST OF REF = LISTn[
"XBus.", 
op47AlphaBetaBA,
List4["L3BA.",   NIL,   "S3BA.",   "SDeltaB." ],
LISTn["LSumLt.",  NIL,   "SSumLt.",  "PopSaBA" ], -- not "PopSaBA."
LISTn["LSumRt.",  NIL,   "SSumRt.",  "PopSbBA" ], -- not "PopSbBA."
List4["LAB.",    NIL,   "SAB.",   NIL   ] ];
LSAdder: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUAdderRow[
design: design,
name:  "IFUAsmLSForm.LSAdder",
rightCtl: LIST[GND, GND, GND, "PushScBA"],
top:  LSAdderTop,
in:   LISTn[
LISTn["LSumLt.", "SLimNA.", "SSumLt.", "PopSaBA"], -- not "PopSaBA."
LISTn["LSumRt.", "SAB.",  "SSumRt.", "PopSbBA"] ], -- not "PopSbBA."
out:  LISTn[ List4["LSum.",  "SLimTest.", "SSum.",  "SDeltaB."]],
bot:  LSPostAdderTop,
sums:  4,
rp:   lsFormRP ]};
LSPostAdderTop: LIST OF REF = LISTn[
"XBus.", 
op47AlphaBetaBA,
List4["L3BA.",   "SLimNA.",  "S3BA.",   NIL ],
List4["LSum.",   "SLimTest.",  "SSum.",   NIL ],
NIL,
List4["LAB.",    "SAB.",   "SAB.",   NIL ] ];
LSPostAdder: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "IFUAsmLSForm.LSPostAdder",
rowType: IFUPW.cmosMet2,
topRP: lsFormRP,
top:  LSPostAdderTop,
left:  LIST["LSum.0", "SSum.0", "SLimTest.0", "SLimTest.1","SLimTest.2","SLimTest.3"],
right:  NIL,  -- XXX Fix this - Signals above are not needed
bot:  LSLatchBTop,
botRP:  lsFormRP ]};
LSum17: LIST OF REF ← LISTn
[GND,"LSum.1","LSum.2","LSum.3","LSum.4","LSum.5","LSum.6","LSum.7"];
SSum17: LIST OF REF ← LISTn
[GND,"SSum.1","SSum.2","SSum.3","SSum.4","SSum.5","SSum.6","SSum.7"];
SLimTest47: LIST OF REF ← LISTn
[GND,GND,GND,GND, "SLimTest.4", "SLimTest.5", "SLimTest.6","SLimTest.7"];
SLimTBA47: LIST OF REF ← LISTn
[NIL,NIL,NIL,NIL, "SLimTBA.4", "SLimTBA.5", "SLimTBA.6","SLimTBA.7"];
LSLatchBTop: LIST OF REF = LISTn[
"XBus.",
op47AlphaBetaBA,
List4["L3BA.",   NIL,     "S3BA.",   "SLimNA."],
LISTn[LSum17,   NIL,    SSum17,   SLimTest47],
NIL,
List4["LAB.",    NIL,    "SAB.",   NIL] ];
LSLatchB: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmLSForm.LSLatchB",
type:   LISTn["GPLatch"],
top:  LSLatchBTop,
leftCtl: LIST["PhB", "VBB"],
in:   LISTn[LISTn[LSum17,  NIL,  SSum17,  SLimTest47]],
out:  LISTn[LISTn["LBA.",  NIL,  "SBA.",  SLimTBA47]],
bot:  LSSwitchOutSLimitTestTop,
rp:   lsFormRP ]};
LSSwitchOutSLimitTestTop: LIST OF REF = LISTn[
"XBus.",
op47AlphaBetaBA,
List4["L3BA.",  NIL,     "S3BA.",   "SLimNA."],
LISTn["LBA.",  NIL,    "SBA.",   SLimTBA47],
NIL,
List4["LAB.",   NIL,    "SAB.",   NIL] ];
LSSwitchOutSLimitTest: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "IFUAsmLSForm.LSSwitchOutSLimitTest",
rowType: IFUPW.cmosMet2,
topRP: lsFormRP,
top:  LSSwitchOutSLimitTestTop,
left:  LIST["SLimTBA.4", "SLimTBA.5", "SLimTBA.6","SLimTBA.7"],
right:  NIL,
bot:  LSFormBot,
botRP:  lsFormRP ]};
LSFormBot: LIST OF REF = LISTn[
"XBus.",
op47AlphaBetaBA,
List4["L3BA.",  NIL,     "S3BA.",   "SLimNA."],
List4["LBA.",   NIL,    "SBA.",   NIL],
NIL,
List4["LAB.",   NIL,    "SAB.",   NIL] ];
module:  Rope.ROPE ← "IFUAsmLSForm";
LSForm: PUBLIC IFUPW.Frame ← IFUPW.NFSFUP[module, y, LIST[
LStackRdPreCharge,
LStackRdMux,
LStackRdLatchA,
LStackXBusDr,
LStackWtBuf,
LStackWtMux,
LSMuxSwitching,
LSArgFormMux,
LSCrossConnLSAB,
LSArgFormBuf,
LSPreAdderAdjust,
LSAdder,
LSPostAdder,
LSLatchB,
LSSwitchOutSLimitTest ] ];
LSFormCT: Commander.CommandProc =
{IFUPW.AssembleFrame[IFUAsm.RefDesign[], LSForm, cmd ] };
Commander.Register   [proc:   LSFormCT, key: module];
END.