IFUAsmStatus.mesa
Copyright c 1985 by Xerox Corporation. All rights reserved.
Last Edited by June 9, 1985 6:51:58 pm PDT
DIRECTORY
CD,
Commander,
IFUAsm,
IFUPW,
Rope;
IFUAsmStatus: CEDAR PROGRAM
IMPORTS Commander, IFUAsm, IFUPW, Rope =
BEGIN
GND: Rope.ROPE = IFUPW.GND;
VDD: Rope.ROPE = IFUPW.VDD;
statusSeqTop: BOOL ← IFUAsm.sequential;
statusSeq:  BOOL ← IFUAsm.statusSequential;
fpAlt: LIST OF REF = IFUPW.LISTn[
NIL, NIL, NIL, NIL,
LIST[VDD, VDD,"CScrcRt0B","CScrcRt1B"],
LIST[VDD, VDD,"CScrcRt0B","CScrcRt1B"],
NIL, NIL];
StatusTop: LIST OF REF = IFUPW.LISTn[
"XBus."];
StatusBusXForm: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "StatusBusXForm",
rowType: IFUPW.cmosMet2,
topSeq: statusSeqTop,
top:  StatusTop,
left:  NIL,
right:  LIST["CScrcRt0B","CScrcRt1B"],
bot:  StatusMuxLevel3Top,
botSeq: statusSeq,
fixGV: TRUE ];
IFUPW.rngByte ← 8;
IFUPW.rngBit  ← 4};
StatusMuxLevel3Top: LIST OF REF = IFUPW.LISTn[
"XBus.",
NIL,
NIL,
NIL,
NIL,
fpAlt];
StatusMuxLevel3: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMuxLevel3",
top:  StatusMuxLevel3Top,
ctl:  LIST["SetStatusFrom3LevBA", "SetStatusFrom3LevBA'"],
in:   IFUPW.LISTn["Status3BA.",  "Status0AB."],
out:  IFUPW.LISTn["StatusBx."],
bot:  StatusMuxRescheduleTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusMuxRescheduleTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status0AB.",
"StatusBx.",
NIL,
fpAlt];
StatusMuxReschedule: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMuxReschedule",
top:  StatusMuxRescheduleTop,
ctl:  LIST["RescheduleBA","RescheduleBA'"],
in:   IFUPW.LISTn[VDD,   "StatusBx."],
out:  IFUPW.LISTn[LIST[NIL,NIL,NIL,NIL,NIL,NIL,NIL,"StatusBxx.7."]],
bot:  StatusMuxTrapEnableTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusMuxTrapEnableTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status0AB.",
"StatusBx.",
IFUPW.LISTn[NIL,NIL,NIL,NIL,NIL,NIL,NIL,"StatusBxx.7."],
fpAlt];
StatusMuxTrapEnable: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMuxTrapEnable",
top:  StatusMuxTrapEnableTop,
ctl:  LIST["ClearTrapEnableBA","ClearTrapEnableBA'"],
in:   IFUPW.LISTn[GND,   "StatusBx."],
out:  IFUPW.LISTn[LIST[NIL,NIL,NIL,NIL,NIL,NIL,"StatusBxx.6.",NIL]],
bot:  StatusMuxFPMultTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusMuxFPMultTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status0AB.",
"StatusBx.",
IFUPW.LISTn[NIL,NIL,NIL,NIL,NIL,NIL,"StatusBxx.6.","StatusBxx.7."],
fpAlt];
StatusMuxFPMult:  PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMuxFPMult",
top:  StatusMuxFPMultTop,
ctl:  LIST["SetFPMStatusBA", "SetFPMStatus'"],
in:   IFUPW.LISTn[fpAlt,  "StatusBx."],
out:  IFUPW.LISTn[LIST[NIL,NIL,NIL,NIL,NIL,"StatusBxx.5.",NIL,NIL]],
bot:  StatusMuxFPAluTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusMuxFPAluTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status0AB.",
"StatusBx.",
IFUPW.LISTn[NIL,NIL,NIL,NIL,NIL,"StatusBxx.5.","StatusBxx.6.","StatusBxx.7."],
fpAlt];
StatusMuxFPAlu:   PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMuxFPAlu",
top:  StatusMuxFPAluTop,
ctl:  LIST["SetFPAStatusBA", "SetFPAStatus'"],
in:   IFUPW.LISTn[fpAlt, "StatusBx."],
out:  IFUPW.LISTn[LIST[NIL,NIL,NIL,NIL,"StatusBxx.4.",NIL,NIL,NIL]],
bot:  StatusMuxUserModeTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusMuxUserModeTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status0AB.",
"StatusBx.",
IFUPW.LISTn[NIL,NIL,NIL,NIL,"StatusBxx.4.","StatusBxx.5.","StatusBxx.6.","StatusBxx.7."]];
StatusMuxUserMode:  PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMuxUserMode",
top:  StatusMuxUserModeTop,
ctl:  LIST["ClearUserModeBA", "ClearUserModeBA'"],
in:   IFUPW.LISTn[GND,   "StatusBx."],
out:  IFUPW.LISTn[LIST[NIL,NIL,NIL,"StatusBxx.3.",NIL,NIL,NIL,NIL]],
bot:  StatusLatchBTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusLatchBTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status0AB.",
NIL,
LIST[NIL,NIL,NIL,"StatusBxx.3.","StatusBxx.4.","StatusBxx.5.","StatusBxx.6.","StatusBxx.7."]];
StatusLatchB:    PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusLatchB",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatchBTop,
ctl:  LIST["PhB"],
in:   IFUPW.LISTn[LIST
[VDD,VDD,VDD,"StatusBxx.3.","StatusBxx.4.","StatusBxx.5.","StatusBxx.6.","StatusBxx.7."]],
out:  IFUPW.LISTn["StatusBA."],
bot:  StatusMuxFromXBusTop,
seq:  statusSeq ]};
StatusMuxFromXBusTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status0AB.",
"StatusBA."];
StatusMuxFromXBus: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
IFUPW.rngByte ← 4;
IFUPW.rngBit  ← 8;
cell ← IFUPW.AbutX[design, "StatusMuxNybl", "StatusMuxNybl"];
cell ← IFUPW.AbutX[design, cell, cell];
cell ← IFUPW.AbutX[design, cell, cell];
cell ← IFUPW.AssignRowPinsAndRename[
design:  design,
rowName:  cell,
newName: "StatusMuxFromXBus",
identity:  FALSE,
top:   StatusMuxFromXBusTop,
bot:   StatusLatch0ATop,
ctl:   LIST["EnableStatusFromXBus"],
seq:   statusSeq ]};
StatusLatch0ATop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status0AB.",
"Status0A."];
StatusLatch0A:   PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusLatch0A",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch0ATop,
ctl:  LIST["PhA"],
in:   IFUPW.LISTn["Status0A."],
out:  IFUPW.LISTn["Status0AB."],
bot:  StatusMux0BTop,
seq:  statusSeq ]};
StatusMux0BTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status0AB."];
StatusMux0B:    PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMux0B",
top:  StatusMux0BTop,
ctl:  LIST["PipeCycle0AB", "PipeAdv0AB"],
in:   IFUPW.LISTn["Status1AB.", "Status0AB."],
out:  IFUPW.LISTn["Status0B."],
bot:  StatusLatch0BTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusLatch0BTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status1AB.",
"Status0B."];
StatusLatch0B:    PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusLatch0B",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch0BTop,
ctl:  LIST["PhB"],
in:   IFUPW.LISTn["Status0B."],
out:  IFUPW.LISTn["Status0BA."],
bot:  StatusLatch1ATop,
seq:  statusSeq ]};
StatusLatch1ATop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status1AB.",
"Status0BA."];
StatusLatch1A:   PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusLatch1A",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch1ATop,
ctl:  LIST["PhA"],
in:   IFUPW.LISTn["Status0BA."],
out:  IFUPW.LISTn["Status1AB."],
bot:  StatusMux1ATop,
seq:  statusSeq ]};
StatusMux1ATop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status1AB."];
StatusMux1A:    PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMux1A",
top:  StatusMux1ATop,
ctl:  LIST["PipeCycle123AB",  "PipeKill1AB", "PipeAdv1AB'"],
in:   IFUPW.LISTn["Status1BA.", GND,    "Status1AB."],
out:  IFUPW.LISTn["Status1B."],
bot:  StatusLatch1BTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusLatch1BTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status1BA.",
"Status1B."];
StatusLatch1B:    PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusLatch1B",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch1BTop,
ctl:  LIST["PhB"],
in:   IFUPW.LISTn["Status1B."],
out:  IFUPW.LISTn["Status1BA."],
bot:  StatusDriveToXBusTop,
seq:  statusSeq ]};
StatusDriveToXBusTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status1BA."];
StatusDriveToXBus:  PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusDriveToXBus",
type:   IFUPW.LISTn["GPTriDr"],
top:  StatusDriveToXBusTop,
ctl:  LIST["RdStatusAc", "RdStatusAc'"],
in:   IFUPW.LISTn["Status1BA."],
out:  IFUPW.LISTn["XBus."],
bot:  StatusLatch2ATop,
seq:  statusSeq ]};
StatusLatch2ATop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status1BA."];
StatusLatch2A:   PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusLatch2A",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch2ATop,
ctl:  LIST["PhA"],
in:   IFUPW.LISTn["Status1BA."],
out:  IFUPW.LISTn["Status2AB."],
bot:  StatusMux2ATop,
seq:  statusSeq ]};
StatusMux2ATop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status2AB."];
StatusMux2A:    PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMux2A",
top:  StatusMux2ATop,
ctl:  LIST["PipeCycle123AB", "PipeKill2AB", "PipeAdv2AB"],
in:   IFUPW.LISTn["Status2BA.",  GND,    "Status2AB."],
out:  IFUPW.LISTn["Status2B."],
bot:  StatusLatch2BTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusLatch2BTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status2BA.",
"Status2B."];
StatusLatch2B:    PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusLatch2B",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch2BTop,
ctl:  LIST["PhB"],
in:   IFUPW.LISTn["Status2B."],
out:  IFUPW.LISTn["Status2BA."],
bot:  StatusLatch3ATop,
seq:  statusSeq ]};
StatusLatch3ATop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status2BA."];
StatusLatch3A:   PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusLatch3A",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch3ATop,
ctl:  LIST["PhA"],
in:   IFUPW.LISTn["Status2BA."],
out:  IFUPW.LISTn["Status3AB."],
bot:  StatusMux3ATop,
seq:  statusSeq ]};
StatusMux3ATop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
NIL,
"Status3AB."];
StatusMux3A:    PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "StatusMux3A",
top:  StatusMux3ATop,
ctl:  LIST["PipeFault3AB", "PipeCycle123AB", "PipeAdv3AB", "PipeCCTrap3AB"],
in:   IFUPW.LISTn["Status3BA.", "Status3BA.", "Status3AB.", "Status3AB."],
out:  IFUPW.LISTn["Status3B."],
bot:  StatusLatch3BTop,
seq:  statusSeq,
fixGV: TRUE ]};
StatusLatch3BTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
"Status3BA.",
"Status3B." ];
StatusLatch3B: PROC[design: CD.Design] RETURNS[cell: IFUPW.ObjName] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "StatusLatch3B",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch3BTop,
ctl:  LIST["PhB"],
in:   IFUPW.LISTn["Status3B."],
out:  IFUPW.LISTn["Status3BA."],
bot:  StatusBot,
seq:  statusSeq ]};
StatusBot: LIST OF REF = IFUPW.LISTn[
"XBus."];
newDesign:  Rope.ROPE ← IFUAsm.rootName.Cat["Status"];
dataColRows:  LIST OF IFUPW.UserProc ← LIST[
StatusBusXForm,
StatusMuxLevel3,
StatusMuxReschedule,
StatusMuxTrapEnable,
StatusMuxFPMult,
StatusMuxFPAlu,
StatusMuxUserMode,
StatusLatchB,
StatusMuxFromXBus,
StatusLatch0A,
StatusMux0B,
StatusLatch0B,
StatusLatch1A,
StatusMux1A,
StatusLatch1B,
StatusDriveToXBus,
StatusLatch2A,
StatusMux2A,
StatusLatch2B,
StatusLatch3A,
StatusMux3A,
StatusLatch3B ];
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.