IFUAsmFP.mesa
Copyright c 1985 by Xerox Corporation. All rights reserved.
Last Edited by June 16, 1985 1:34:47 pm PDT
DIRECTORY
CD,
Commander,
IFUAsm,
IFUPW,
Rope;
IFUAsmFP: CEDAR PROGRAM
IMPORTS Commander, IFUAsm, IFUPW, Rope =
BEGIN
GND: Rope.ROPE = IFUPW.GND;
VDD: Rope.ROPE = IFUPW.VDD;
fpSeq: BOOL ← IFUAsm.fpSequential;
LISTn: PROC[r0, r1, r2, r3, r4, r5, r6: REFNIL] RETURNS[list: LIST OF REF] =
{RETURN[IFUPW.LISTn[r0, r1, r2, r3, r4, r5, r6]]};
FPModeTop: LIST OF REF = LISTn[
"XBus."];
FPModeAluMuxFromXBus: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "FPModeAluMuxFromXBus",
top:  FPModeTop,
ctl:   LIST["WtFPModeAluBA", "WtFPModeAluBA'"],
in:   LISTn[
"XBus.",
LISTn[NIL, NIL, "FPModeAluAB0.", "FPModeAluAB1."]],
out:  LISTn[LISTn[NIL, NIL, "FPModeAluABx0.", "FPModeAluABx1."]],
bot:  FPModeShiftUpTop,
seq:  fpSeq,
fixGV: TRUE ]};
FPModeShiftUpTop: LIST OF REF = LISTn[
"XBus.",
LISTn[NIL, NIL, "FPModeAluAB0.", "FPModeAluAB1."],
LISTn[NIL, NIL, "FPModeAluABx0.", "FPModeAluABx1."] ];
FPModeShiftUp: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "FPModeShiftUp",
rowType: IFUPW.cmosMet2,
topSeq: fpSeq,
top:  FPModeShiftUpTop,
left:  NIL,
right:  NIL,
bot:  FPModeMultMuxFromXBusTop,
botSeq: fpSeq,
fixGV: TRUE ]};
FPModeMultMuxFromXBusTop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPModeAluAB0.", "FPModeAluAB1.", NIL, NIL],
LISTn["FPModeAluABx0.", "FPModeAluABx1.", NIL, NIL] ];
FPModeMultMuxFromXBus: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "FPModeMultMuxFromXBus",
top:  FPModeMultMuxFromXBusTop,
ctl:   LIST["WtFPModeMultBA", "WtFPModeMultBA'"],
in:   LISTn[
"XBus.",
LISTn[NIL, NIL, "FPModeMultAB0.", "FPModeMultAB1."]],
out:  LISTn[LISTn[NIL, NIL, "FPModeMultABx0.", "FPModeMultABx1."]],
bot:  FPModeLatchATop,
seq:  fpSeq,
fixGV: TRUE ]};
FPModeLatchATop: LIST OF REF = LISTn[
"XBus.",
LIST["FPModeAluAB0.", "FPModeAluAB1.", "FPModeMultAB0.", "FPModeMultAB1."],
LIST["FPModeAluABx0.", "FPModeAluABx1.", "FPModeMultABx0.", "FPModeMultABx1."] ];
FPModeLatchA: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "FPModeLatchA",
type:   LISTn["GPLatch"],
ctl:  LIST["PhA"],
top:  FPModeLatchATop,
in:   LISTn[ LISTn[
"FPModeAluABx0.", "FPModeAluABx1.", "FPModeMultABx0.", "FPModeMultABx1."]],
out:   LISTn[ LISTn[
"FPModeAluAB0.", "FPModeAluAB1.", "FPModeMultAB0.", "FPModeMultAB1."]],
bot:  FPModeLatchBTop,
seq:  fpSeq ]};
FPModeLatchBTop: LIST OF REF = LISTn[
"XBus.",
LIST["FPModeAluAB0.", "FPModeAluAB1.", "FPModeMultAB0.", "FPModeMultAB1."] ];
FPModeLatchB: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "FPModeLatchB",
type:   LISTn["GPLatch"],
ctl:  LIST["PhB"],
top:  FPModeLatchBTop,
in:   LISTn[LISTn[
"FPModeAluAB0.", "FPModeAluAB1.", "FPModeMultAB0.", "FPModeMultAB1."]],
out:  LISTn[LISTn[
"FPModeAluBA0.", "FPModeAluBA1.", "FPModeMultBA0.", "FPModeMultBA1."]],
bot:  FPModeMultTriDrTop,
seq:  fpSeq ]};
FPModeMultTriDrTop: LIST OF REF = LISTn[
"XBus.",
LIST["FPModeAluBA0.", "FPModeAluBA1.", "FPModeMultBA0.", "FPModeMultBA1."] ];
FPModeMultTriDr: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "FPModeMultTriDr",
type:   LISTn["GPTriDr"],
ctl:  LIST["WtFPModeMultBA", "WtFPModeMultBA'"],
top:  FPModeMultTriDrTop,
in:   LISTn[LISTn[GND, GND, "FPModeMultBA0.", "FPModeMultBA1."]],
out:  LISTn["XBus."],
bot:  FPModeShiftDownTop,
seq:  fpSeq ]};
FPModeShiftDownTop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPModeAluBA0.", "FPModeAluBA1.", NIL, NIL] ];
FPModeShiftDown: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "FPModeShiftDown",
rowType: IFUPW.cmosMet2,
topSeq: fpSeq,
top:  FPModeShiftDownTop,
left:  NIL,
right:  NIL,
bot:  FPModeAluTriDrTop,
botSeq: fpSeq,
fixGV: TRUE ]};
FPModeAluTriDrTop: LIST OF REF = LISTn[
"XBus.",
LISTn[NIL, NIL, "FPModeAluBA0.", "FPModeAluBA1."] ];
FPModeAluTriDr: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "FPModeAluTriDr",
type:   LISTn["GPTriDr"],
ctl:  LIST["WtFPModeAluBA", "WtFPModeAluBA'"],
top:  FPModeAluTriDrTop,
in:   LISTn[LISTn[ GND, GND, "FPModeAluBA0.", "FPModeAluBA1."]],
out:  LISTn["XBus."],
bot:  FPModeBottom,
seq:  fpSeq ]};
FPModeBottom: LIST OF REF = LISTn[
"XBus."];
FPMaskFlagMuxFromXBus: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "FPMaskFlagMuxFromXBus",
top:  FPModeBottom,
ctl:   LIST["WtFPMaskFlagBA", "WtFPMaskFlagBA'"],
in:   LISTn[
"XBus.",
LISTn["FPMaskBA.0.", "FPMaskBA.1.",  "FPFlagBA.0.", "FPFlagBA.1."] ],
out:  LISTn[
LISTn["FPMaskA.0.", "FPMaskA.1.",  "FPFlagA.0.", "FPFlagA.1."]],
bot:  FPMaskFlagLatchATop,
seq:  fpSeq,
fixGV: TRUE ]};
FPMaskFlagLatchATop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPMaskBA.0.", "FPMaskBA.1.",  "FPFlagBA.0.", "FPFlagBA.1."],
LISTn["FPMaskAB.0.", "FPMaskAB.1.",  NIL,    NIL],
LISTn["FPMaskA.0.", "FPMaskA.1.",  "FPFlagA.0.", "FPFlagA.1."] ];
FPMaskFlagLatchA: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "FPMaskFlagLatchA",
type:   LISTn["GPLatch"],
ctl:  LIST["PhA"],
top:  FPMaskFlagLatchATop,
in:   LISTn[
LISTn["FPMaskA.0.", "FPMaskA.1.",  "FPFlagA.0.", "FPFlagA.1."] ],
out:  LISTn[
LISTn["FPMaskAB.0.", "FPMaskAB.1.",  "FPFlagAB.0.", "FPFlagAB.1."]],
bot:  FPMaskFlagDecodeStatusTop,
seq:  fpSeq ]};
FPMaskFlagDecodeStatusTop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPMaskBA.0.", "FPMaskBA.1.",  "FPFlagBA.0.", "FPFlagBA.1."],
LISTn["FPMaskAB.0.", "FPMaskAB.1.",  NIL,    NIL],
NIL,
LISTn[NIL,    NIL,     "FPFlagAB.0.", "FPFlagAB.1."] ];
vals: REF IFUPW.ValArray ← NEW[IFUPW.ValArray ← [
[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15],
[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15] ] ];
FPMaskFlagDecodeStatus: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUDecoderRow[
design: design,
name:  "FPMaskFlagDecodeStatus",
top:  FPMaskFlagDecodeStatusTop,
ctl:  LIST[
"EPFaultB.0", "EPFaultB.0'",
"EPFaultB.1", "EPFaultB.1'",
"EPFaultB.2", "EPFaultB.2'",
"EPFaultB.3", "EPFaultB.3'"],
val:  vals,
out:  LISTn[
LISTn["MaskFltIdxB.0.", "MaskFltIdxB.1.", "FlagFltIdxB.0.", "FlagFltIdxB.1."]],
bot:  FPMaskFlagGateTop,
seq:  fpSeq ]};
FPMaskFlagGateTop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPMaskBA.0.", "FPMaskBA.1.",  "FPFlagBA.0.", "FPFlagBA.1."],
LISTn["FPMaskAB.0.", "FPMaskAB.1.",  NIL,    NIL],
LISTn["MaskFltIdxB.0.", "MaskFltIdxB.1.", "FlagFltIdxB.0.", "FlagFltIdxB.1."],
LISTn[NIL,    NIL,     "FPFlagAB.0.", "FPFlagAB.1."]];
FPMaskFlagGate: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "FPMaskFlagGate",
type:   LISTn[LISTn["GPNand", "GPNand", "GPNor", "GPNor"]],
ctl:  NIL,
top:  FPMaskFlagGateTop,
in:   LISTn[
LISTn["MaskFltIdxB.0.", "MaskFltIdxB.1.", "FlagFltIdxB.0.", "FlagFltIdxB.1."],
LISTn["FPMaskInvAB.0.", "FPMaskInvAB.1.", "FPFlagAB.0.", "FPFlagAB.1."]],
out:  LISTn[
LISTn["FPNFaultB.0.",  "FPNFaultB.1.",  "FPFlagInvB.0.", "FPFlagInvB.1."]],
bot:  FPMaskFlagInvTop,
seq:  fpSeq ]};
FPMaskFlagInvTop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPMaskBA.0.",  "FPMaskBA.1.",  "FPFlagBA.0.", "FPFlagBA.1."],
LISTn["FPMaskAB.0.",  "FPMaskAB.1.",  NIL,    NIL],
LISTn["FPNFaultB.0.",   "FPNFaultB.1.",  "FPFlagInvB.0.", "FPFlagInvB.1."],
LISTn[NIL,     NIL,     "FPFlagAB.0.", "FPFlagAB.1."],
LISTn["FPMaskInvAB.0.", "FPMaskInvAB.1.", NIL,    NIL] ];
FPMaskFlagInv: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "FPMaskFlagInv",
type:   LISTn["GPInv"],
ctl:  NIL,
top:  FPMaskFlagInvTop,
in:   LISTn[LISTn
["FPMaskAB.0.", "FPMaskAB.1.",  "FPFlagInvB.0.", "FPFlagInvB.1."]],
out:  LISTn[LISTn
["FPMaskInvAB.0.", "FPMaskInvAB.1.", "FPFlagB.0.", "FPFlagB.1."]],
bot:  FPMaskFlagMuxBTop,
seq:  fpSeq ]};
FPMaskFlagMuxBTop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPMaskBA.0.", "FPMaskBA.1.",  "FPFlagBA.0.", "FPFlagBA.1."],
LISTn["FPMaskAB.0.", "FPMaskAB.1.",  NIL,    NIL],
LISTn["FPNFaultB.0.",  "FPNFaultB.1.",  "FPFlagB.0.",  "FPFlagB.1."],
LISTn[NIL,    NIL,     "FPFlagAB.0.", "FPFlagAB.1."] ];
FPMaskFlagMuxB: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "FPMaskFlagMuxB",
top:  FPMaskFlagMuxBTop,
ctl:   LIST["ChkStatusAndNResetB", "ChkStatusAndNResetB'"],
in:   LISTn[
LISTn[NIL, NIL, "FPFlagB.0.",  "FPFlagB.1."],
LISTn[NIL, NIL, "FPFlagAB.0.", "FPFlagAB."]],
out:  LISTn[
LISTn[NIL, NIL,  "FPFlagBx.0.", "FPFlagBx.1."]],
bot:  FPMaskFlagMatchTop,
seq:  fpSeq,
fixGV: TRUE ]};
FPMaskFlagMatchTop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPMaskBA.0.", "FPMaskBA.1.", "FPFlagBA.0.", "FPFlagBA.1."],
LISTn["FPMaskAB.0.", "FPMaskAB.1.", "FPFlagBx.0.", "FPFlagBx.1."],
LISTn["FPNFaultB.0.",  "FPNFaultB.1.", NIL,    NIL] ];
FPMaskFlagMatch: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMatchRow[
design: design,
name:  "FPMaskFlagMatch",
chkFor: LISTn[VDD], -- one GND => Fault
top:  FPMaskFlagMatchTop,
in1:  3,  -- input index
col2:  4,  -- blank column
col3:  5,  -- blank column
sideOuts: IFUPW.List4["FPFaultng0", "FPFaultng1", NIL, NIL], -- logic true
outsSide: IFUPW.LtSide,
bot:  FPMaskFlagLatchBTop,
seq:  fpSeq ]};
FPMaskFlagLatchBTop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPMaskBA.0.", "FPMaskBA.1.", "FPFlagBA.0.", "FPFlagBA.1."],
LISTn["FPMaskAB.0.", "FPMaskAB.1.", "FPFlagBx.0.", "FPFlagBx.1."],
NIL ];
FPMaskFlagLatchB: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "FPMaskFlagLatchB",
type:   LISTn["GPLatch"],
ctl:  LIST["PhB"],
top:  FPMaskFlagLatchBTop,
in:   LISTn[
LISTn["FPMaskAB.0.", "FPMaskAB.1.", "FPFlagBx.0.", "FPFlagBx.1."]],
out:  LISTn[
LISTn["FPMaskBA.0.", "FPMaskBA.1.", "FPFlagBA.0.", "FPFlagBA.1."]],
bot:  FPMaskFlagDriveXBusTop,
seq:  fpSeq ]};
FPMaskFlagDriveXBusTop: LIST OF REF = LISTn[
"XBus.",
LISTn["FPMaskBA.0.", "FPMaskBA.1.", "FPFlagBA.0.", "FPFlagBA.1."]];
FPMaskFlagDriveXBus: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "FPMaskFlagDriveXBus",
type:   LISTn["GPTriDr"],
ctl:  LIST["WtMaskFlagAc", "WtMaskFlagAc'"],
top:  FPMaskFlagDriveXBusTop,
in:   LISTn[
LISTn["FPMaskBA.0.", "FPMaskBA.1.", "FPFlagBA.0.", "FPFlagBA.1."]],
out:  LISTn["XBus."],
bot:  FPMaskFlagBot,
seq:  fpSeq ]};
FPMaskFlagBot: LIST OF REF = LISTn[
"XBus."];
newDesign:  Rope.ROPE ← IFUAsm.rootName.Cat["FP"];
dataColRows:  LIST OF IFUPW.UserProc ← LIST[
FPModeAluMuxFromXBus,
FPModeShiftUp,
FPModeMultMuxFromXBus,
FPModeLatchA,
FPModeLatchB,
FPModeMultTriDr,
FPModeShiftDown,
FPModeAluTriDr,
FPMaskFlagMuxFromXBus,
FPMaskFlagLatchA,
FPMaskFlagDecodeStatus,
FPMaskFlagGate,
FPMaskFlagInv,
FPMaskFlagMatch,
FPMaskFlagMuxB,
FPMaskFlagLatchB,
FPMaskFlagDriveXBus ];
CDAssemble: IFUPW.UserProc=
{RETURN[IFUPW.AssembleList[design,   dataColRows]]};
CTAssemble: Commander.CommandProc =
{[ ] ← IFUPW.AssembleList[IFUAsm.refDesign, dataColRows, newDesign, cmd]};
IFUAsm.RegDataColRows [procs:  dataColRows, name: newDesign.Cat["Cell"]];
Commander.Register   [proc:   CTAssemble, key: newDesign.Cat["Cell"]];
IFUPW.Register     [userProc: CDAssemble, name: newDesign.Cat["Cell"]];
END.