IFUAsmPCFormTop:
CEDAR
PROGRAM
IMPORTS Commander, IFUAsm, IFUPW, Rope =
BEGIN
GND: Rope.ROPE = IFUPW.GND;
VDD: Rope.ROPE = IFUPW.VDD;
pcTopSeq: BOOL ← FALSE;
LIST8:
PUBLIC
PROC [r0, r1, r2, r3, r4, r5, r6, r7:
REF ←
NIL ]
RETURNS[list:
LIST
OF
REF] =
{RETURN[IFUPW.LISTn[r0, r1, r2, r3, r4, r5, r6, r7]]};
LIST6:
PUBLIC
PROC [r0, r1, r2, r3, r4, r5:
REF ←
NIL ]
RETURNS[list:
LIST
OF
REF] =
{RETURN[IFUPW.LISTn[r0, r1, r2, r3, r4, r5]]};
abgdAB: IFUPW.List = IFUPW.List4["AlphaAB.", "BetaAB.", "GammaAB.", "DeltaAB."];
opNILAB: IFUPW.List = IFUPW.List4["OpAB.", NIL, NIL, NIL];
XopSetupOpTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
opNILAB ];
XopSetupOp:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.SwitchBoxRow[
design: design,
name: "XopSetupOp",
rowType: IFUPW.cmosMet2,
topSeq: pcTopSeq,
top: XopSetupOpTop,
left: NIL,
right: LIST["UserMode"],
bot: XopSetupOpTop,
botSeq: pcTopSeq,
fixGV: TRUE ]};
XopGenRowTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
LIST6["OpAB.",
NIL,
IFUPW.List8[ NIL, NIL, NIL,"UserMode", "OpAB.0", "OpAB.1", "OpAB.2", "OpAB.3"],
IFUPW.List8["OpAB.4", "OpAB.5", "OpAB.6", "OpAB.7", NIL, NIL, NIL, NIL] ] ];
XopGenRow:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "XopGenRow",
type: LIST6["GPTriDr"],
top: XopGenRowTop,
ctl: IFUPW.Listn["PCBusSrcXopBc", "PCBusSrcXopBc'"],
in: LIST6[ LIST6[
GND,
GND,
IFUPW.List8[GND,GND,GND,"UserMode", "OpAB.0", "OpAB.1", "OpAB.2", "OpAB.3"],
IFUPW.List8["OpAB.4", "OpAB.5", "OpAB.6", "OpAB.7", GND,GND,GND,GND] ] ],
out: LIST6["PCBus."],
bot: TrapSetup0Top,
seq: pcTopSeq ]};
TrapSetup0Top:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
opNILAB];
TrapSetup0:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.SwitchBoxRow[
design: design,
name: "TrapSetup0",
rowType: IFUPW.cmosMet2,
topSeq: pcTopSeq,
top: TrapSetup0Top,
left: NIL,
right:
LIST[
"EPFaultB.0", "EPFaultB.1", "EPFaultB.2", "EPFaultB.3",
"EUCondSel2AB.0", "EUCondSel2AB.1", "EUCondSel2AB.2", "EUCondSel2AB.3"],
bot: TrapLatch0Top,
botSeq: pcTopSeq,
fixGV: TRUE ]};
TrapLatch0Top:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
LIST6["OpAB.",
LIST6[ "EPFaultB.0", "EPFaultB.1", "EPFaultB.2", "EPFaultB.3"],
LIST6[ "EUCondSel2AB.0", "EUCondSel2AB.1", "EUCondSel2AB.2", "EUCondSel2AB.3"],
NIL ] ];
TrapLatch0:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "TrapLatch0",
type: LIST6["GPLatch"],
top: TrapLatch0Top,
ctl: IFUPW.Listn["PhB"],
in: LIST6[
LIST6[
NIL,
LIST6[ "EPFaultB.0", "EPFaultB.1", "EPFaultB.2", "EPFaultB.3"],
LIST6[ "EUCondSel2AB.0", "EUCondSel2AB.1", "EUCondSel2AB.2", "EUCondSel2AB.3"],
NIL ] ],
out: LIST6[
LIST6[
NIL,
LIST6[ "EPFaultBA.0", "EPFaultBA.1", "EPFaultBA.2", "EPFaultBA.3"],
LIST6[ "EUCondSel2BA.0", "EUCondSel2BA.1", "EUCondSel2BA.2", "EUCondSel2BA.3"],
NIL ] ],
bot: TrapSetup1Top,
seq: pcTopSeq ]};
TrapSetup1Top:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
LIST6[
"OpAB.",
LIST6[ "EPFaultBA.0", "EPFaultBA.1", "EPFaultBA.2", "EPFaultBA.3"],
LIST6[ "EUCondSel2BA.0", "EUCondSel2BA.1", "EUCondSel2BA.2", "EUCondSel2BA.3"],
NIL ] ];
TrapSetup1:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.SwitchBoxRow[
design: design,
name: "TrapSetup1",
rowType: IFUPW.cmosMet2,
topSeq: pcTopSeq,
top: TrapSetup1Top,
left: NIL,
right: LIST["ExceptCodeAB.0", "ExceptCodeAB.1", "ExceptCodeAB.2","ExceptCodeAB.3"],
bot: TrapMux1Top,
botSeq: pcTopSeq,
fixGV: TRUE ]};
TrapMux1Top:
LIST
OF
REF =
LIST[
"XBus.",
"PCBus.",
abgdAB,
LIST6[
"OpAB.",
NIL,
NIL,
LIST6[ "EPFaultBA.0", "EPFaultBA.1", "EPFaultBA.2", "EPFaultBA.3"] ],
NIL,
LIST6[
NIL,
NIL,
NIL,
LIST6[ "EUCondSel2BA.0", "EUCondSel2BA.1", "EUCondSel2BA.2", "EUCondSel2BA.3"] ],
GND,
VDD,
LIST6[
NIL,
NIL,
NIL,
LIST6[ "ExceptCodeAB.0", "ExceptCodeAB.1", "ExceptCodeAB.2","ExceptCodeAB.3"] ] ];
TrapMux1:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUMuxRow[
design: design,
name: "TrapMux1",
top: TrapMux1Top,
ctl: IFUPW.Listn["TrapExcept", "TrapEUCC", "TrapFPFault", "TrapCacheFault"],
in: LIST6[
LIST6[
GND,
GND,
IFUPW.List8[ GND, GND, GND, GND, GND, GND, GND, GND ],
IFUPW.List8[ "ExceptCodeAB.0", "ExceptCodeAB.1", "ExceptCodeAB.2","ExceptCodeAB.3", GND, GND, GND, GND] ],
LIST6[
GND,
GND,
IFUPW.List8[ GND, GND, GND, GND, GND, GND, GND, VDD ],
IFUPW.List8[ "EUCondSel2BA.0", "EUCondSel2BA.1", "EUCondSel2BA.2", "EUCondSel2BA.3", GND, GND, GND, GND] ],
LIST6[
GND,
GND,
IFUPW.List8[ GND, GND, GND, GND, GND, GND, VDD, GND ],
IFUPW.List8[ "EPFaultBA.0", "EPFaultBA.1", "EPFaultBA.2", "EPFaultBA.3", GND, GND, GND, GND] ],
LIST6[
GND,
GND,
IFUPW.List8[ GND, GND, GND, GND, GND, GND, VDD, VDD ],
IFUPW.List8[ "EPFaultBA.0", "EPFaultBA.1", "EPFaultBA.2", "EPFaultBA.3", GND, GND, GND, GND] ] ],
out: LIST6["TrapPCA."],
bot: TrapLatch1Top,
seq: pcTopSeq,
fixGV: TRUE ]};
TrapLatch1Top:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
opNILAB,
"TrapPCA."];
TrapLatch1:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "TrapLatch1",
type: LIST6["GPLatch"],
top: TrapLatch1Top,
ctl: IFUPW.Listn["PhA"],
in: LIST6["TrapPCA."],
out: LIST6["TrapPCAB."],
bot: TrapDrivePCBusTop,
seq: pcTopSeq ]};
TrapDrivePCBusTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
opNILAB,
"TrapPCAB." ];
TrapDrivePCBus:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "TrapDrivePCBus",
type: LIST6["GPTriDr"],
top: TrapDrivePCBusTop,
ctl: IFUPW.Listn["PCBusSrcTrapBc", "PCBusSrcTrapBc'"],
in: LIST6["TrapPCAB."],
out: LIST6["PCBus."],
bot: ABGDDrivePCBusTop,
seq: pcTopSeq ]};
ABGDDrivePCBusTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
opNILAB ];
ABGDDrivePCBus:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "ABGDDrivePCBus",
type: LIST6["GPTriDr"],
top: ABGDDrivePCBusTop,
ctl: IFUPW.Listn["PCBusSrcABGDBc", "PCBusSrcABGDBc'"],
in: LIST6[abgdAB],
out: LIST6["PCBus."],
bot: XABTop,
seq: pcTopSeq ]};
XABTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
opNILAB];
XAB:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "XAB",
type: LIST6["GPLatch"],
top: XABTop,
ctl: IFUPW.Listn["PhA"],
in: LIST6["XBus."],
out: LIST6["XAB."],
bot: XABDrivePCBusTop,
seq: pcTopSeq ]};
XABDrivePCBusTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
opNILAB,
"XAB." ];
XABDrivePCBus:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "XABDrivePCBus",
type: LIST6["GPTriDr"],
top: XABDrivePCBusTop,
ctl: IFUPW.Listn["PCBusSrcXaBc", "PCBusSrcXaBc'"],
in: LIST6["XAB."],
out: LIST6["PCBus."],
bot: BranchOffsetSetupTop,
seq: pcTopSeq ]};
BranchOffsetSetupTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
abgdAB,
opNILAB,
"XAB." ];
BranchOffsetSetup:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.SwitchBoxRow[
design: design,
name: "BranchOffsetSetup",
rowType: IFUPW.cmosMet2,
topSeq: pcTopSeq,
top: BranchOffsetSetupTop,
left: NIL,
right: NIL,
bot: BranchOffsetMuxTop,
botSeq: pcTopSeq,
fixGV: TRUE ]};
LISTOpAlphaBetaAB: LIST OF REF = LIST6["OpAB.", NIL, "AlphaAB.", "BetaAB."];
LISTOpAlphaBetaBA: LIST OF REF = LIST6["OpBA.", NIL, "AlphaBA.", "BetaBA."];
alphaSign: IFUPW.List = IFUPW.List8["AlphaAB.7", "AlphaAB.7", "AlphaAB.7", "AlphaAB.7", "AlphaAB.7", "AlphaAB.7", "AlphaAB.7", "AlphaAB.7"];
betaSign: IFUPW.List = IFUPW.List8["BetaAB.7", "BetaAB.7", "BetaAB.7", "BetaAB.7", "BetaAB.7", "BetaAB.7", "BetaAB.7", "BetaAB.7"];
signedAlpBet: LIST OF REF = LIST6[alphaSign, alphaSign, "AlphaAB.", "BetaAB."];
signedAlpha: LIST OF REF = LIST6[alphaSign, alphaSign, alphaSign, "AlphaAB."];
signedBeta: LIST OF REF = LIST6[betaSign, betaSign, betaSign, "BetaAB."];
BranchOffsetMuxTop:
LIST
OF
REF =
IFUPW.LISTn[
"XBus.",
"PCBus.",
abgdAB,
LISTOpAlphaBetaAB,
"XAB.",
NIL,
GND,
VDD,
signedAlpha,
signedBeta ];
BranchOffsetMux:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUMuxRow[
design: design,
name: "BranchOffsetMux",
top: BranchOffsetMuxTop,
ctl: LIST["PCBrAlphaA","PCBrBetaA","PCBrAlphaBetaA","PCBrABGDA","PCBrXaA"],
in: LIST6[
signedAlpha,
signedBeta,
signedAlpBet,
abgdAB,
"XAB."],
out: LIST6["PCBranchOSetA."],
bot: BranchOffsetLatchTop,
seq: pcTopSeq,
fixGV: TRUE ]};
BranchOffsetLatchTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
NIL,
LISTOpAlphaBetaAB,
NIL,
"PCBranchOSetA."];
BranchOffsetLatch:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "BranchOffsetLatch",
type: LIST6["GPLatch"],
top: BranchOffsetLatchTop,
ctl: IFUPW.Listn["PhA"],
in: LIST6["PCBranchOSetA."],
out: LIST6["PCBranchOSetAB."],
bot: BranchPhaseMuxTop,
seq: pcTopSeq ]};
oplength:
LIST
OF
REF = LIST6[
GND,
GND,
GND,
IFUPW.List8[GND, GND, GND, GND, GND, "OpLengthBA.0", "OpLengthBA.1", "OpLengthBA.2"]];
BranchPhaseMuxTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranchOSetAB.",
LISTOpAlphaBetaAB];
BranchPhaseMux:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUMuxRow[
design: design,
name: "BranchPhaseMux",
top: BranchPhaseMuxTop,
ctl: IFUPW.Listn["PhA", "PhB"],
in: LIST6[oplength, "PCBranchOSetAB." ],
out: LIST6["PCBranch."],
bot: BranchBufferTop,
seq: pcTopSeq,
fixGV: TRUE ]};
BranchBufferTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranch.",
LISTOpAlphaBetaAB,
oplength];
BranchBuffer:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "BranchBuffer",
type: LIST6["GPBuf"],
top: BranchBufferTop,
ctl: NIL,
in: LIST6["PCBranch."],
out: LIST6["PCBranchBuf."],
bot: OpLengthBranchSetupTop,
seq: pcTopSeq ]};
OpLengthBranchSetupTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranchBuf.",
LISTOpAlphaBetaAB,
oplength ];
OpLengthBranchSetup:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.SwitchBoxRow[
design: design,
name: "OpLengthBranchSetup",
rowType: IFUPW.cmosMet2,
topSeq: pcTopSeq,
top: OpLengthBranchSetupTop,
left: NIL,
right: LIST["OpLengthBA.0", "OpLengthBA.1", "OpLengthBA.2"],
bot: OpAlphaBetaLatchTop,
botSeq: pcTopSeq,
fixGV: TRUE ]};
OpAlphaBetaLatchTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranchBuf.",
LISTOpAlphaBetaAB];
OpAlphaBetaLatch:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "OpAlphaBetaLatch",
type: LIST6["GPLatch"],
top: OpAlphaBetaLatchTop,
ctl: IFUPW.Listn["PhB"],
in: LIST6[LISTOpAlphaBetaAB],
out: LIST6[LISTOpAlphaBetaBA],
bot: NPCLatchTop,
seq: pcTopSeq ]};
NPCLatchTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranchBuf.",
LISTOpAlphaBetaBA];
NPCLatch:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "NPCLatch",
type: LIST6["GPLatch"],
top: NPCLatchTop,
ctl: IFUPW.Listn["PhB"],
in: LIST6["PCBus."],
out: LIST6["NPCBA."],
bot: PCABMuxTop,
seq: pcTopSeq ]};
PCABMuxTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranchBuf.",
LISTOpAlphaBetaBA,
NIL,
"NPCBA."];
PCABMux:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUMuxRow[
design: design,
name: "PCABMux",
top: PCABMuxTop,
ctl: IFUPW.Listn["PCPlusLengthBA", "MacroJumpBA", "nGetNextInstBA'"],
in: LIST6["SumA.", "NPCBA.", "NPCBA."],
out: LIST6["PCA."],
bot: PCABLatchTop,
seq: pcTopSeq,
fixGV: TRUE ]};
PCABLatchTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranchBuf.",
LISTOpAlphaBetaBA,
"PCA.",
"SumA."];
PCABLatch:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "PCABLatch",
type: LIST6["GPLatch"],
top: PCABLatchTop,
ctl: IFUPW.Listn["PhA"],
in: LIST6["PCA."],
out: LIST6["PCAB."],
bot: PCDrivePCBusTop,
seq: pcTopSeq ]};
PCDrivePCBusTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranchBuf.",
LISTOpAlphaBetaBA,
"PCAB.",
"SumA."];
PCDrivePCBus:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "PCDrivePCBus",
type: LIST6["GPTriDr"],
top: PCDrivePCBusTop,
ctl: IFUPW.Listn["PCBusSrcPCBc", "PCBusSrcPCBc'"],
in: LIST6["PCAB."],
out: LIST6["PCBus."],
bot: PCBALatchTop,
seq: pcTopSeq ]};
PCBALatchTop:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranchBuf.",
LISTOpAlphaBetaBA,
"PCAB.",
"SumA."];
PCBALatch:
PROC[design:
CD.Design]
RETURNS[cell:
IFUPW.ObjName] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "PCBALatch",
type: LIST6["GPLatch"],
top: PCBALatchTop,
ctl: IFUPW.Listn["PhA"],
in: LIST6["PCAB."],
out: LIST6["PCBA."],
bot: PCFormBot,
seq: pcTopSeq ]};
PCFormBot:
LIST
OF
REF = LIST6[
"XBus.",
"PCBus.",
"PCBranchBuf.",
LISTOpAlphaBetaBA,
"PCBA.",
"SumA."];
newDesign: Rope.ROPE ← IFUAsm.rootName.Cat["PCFormTop"];
dataColRows:
LIST
OF
IFUPW.UserProc ←
LIST[
XopSetupOp,
XopGenRow,
TrapSetup0,
TrapLatch0,
TrapSetup1,
TrapMux1,
TrapLatch1,
TrapDrivePCBus,
ABGDDrivePCBus,
XAB,
XABDrivePCBus,
BranchOffsetSetup,
BranchOffsetMux,
BranchOffsetLatch,
BranchPhaseMux,
BranchBuffer,
OpLengthBranchSetup,
OpAlphaBetaLatch,
NPCLatch,
PCABMux,
PCABLatch,
PCDrivePCBus,
PCBALatch ];
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.