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:
REF ←
NIL]
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.