IFUAsmPCFormTop.mesa
Copyright c 1985 by Xerox Corporation. All rights reserved.
Last Edited by June 24, 1985 9:32:12 pm PDT
DIRECTORY
CD,
Commander,
IFUAsm,
IFUPW,
Rope;
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: REFNIL ] 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: REFNIL ] 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.