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: BOOLFALSE;
statusSeq:  BOOLTRUE;
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:  "IFUAsmStatus.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:  "IFUAsmStatus.StatusMuxLevel3",
top:  StatusMuxLevel3Top,
rightCtl: 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:  "IFUAsmStatus.StatusMuxReschedule",
top:  StatusMuxRescheduleTop,
leftCtl: 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:  "IFUAsmStatus.StatusMuxTrapEnable",
top:  StatusMuxTrapEnableTop,
leftCtl: 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:  "IFUAsmStatus.StatusMuxFPMult",
top:  StatusMuxFPMultTop,
leftCtl: 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:  "IFUAsmStatus.StatusMuxFPAlu",
top:  StatusMuxFPAluTop,
leftCtl: 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:  "IFUAsmStatus.StatusMuxUserMode",
top:  StatusMuxUserModeTop,
leftCtl: 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:  "IFUAsmStatus.StatusLatchB",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatchBTop,
leftCtl: LIST["PhB", "VBB"],
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:  "IFUAsmStatus.StatusMuxFromXBus",
identity:  FALSE,
top:   StatusMuxFromXBusTop,
bot:   StatusLatch0ATop,
leftCtl:  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:  "IFUAsmStatus.StatusLatch0A",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch0ATop,
leftCtl: LIST["PhA", "VBB"],
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:  "IFUAsmStatus.StatusMux0B",
top:  StatusMux0BTop,
leftCtl: 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:  "IFUAsmStatus.StatusLatch0B",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch0BTop,
leftCtl: LIST["PhB", "VBB"],
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:  "IFUAsmStatus.StatusLatch1A",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch1ATop,
leftCtl: LIST["PhA", "VBB"],
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:  "IFUAsmStatus.StatusMux1A",
top:  StatusMux1ATop,
leftCtl: 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:  "IFUAsmStatus.StatusLatch1B",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch1BTop,
leftCtl: LIST["PhB", "VBB"],
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:  "IFUAsmStatus.StatusDriveToXBus",
type:   IFUPW.LISTn["GPTriDr"],
top:  StatusDriveToXBusTop,
leftCtl: 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:  "IFUAsmStatus.StatusLatch2A",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch2ATop,
leftCtl: LIST["PhA", "VBB"],
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:  "IFUAsmStatus.StatusMux2A",
top:  StatusMux2ATop,
leftCtl: 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:  "IFUAsmStatus.StatusLatch2B",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch2BTop,
leftCtl: LIST["PhB", "VBB"],
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:  "IFUAsmStatus.StatusLatch3A",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch3ATop,
leftCtl: LIST["PhA", "VBB"],
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:  "IFUAsmStatus.StatusMux3A",
top:  StatusMux3ATop,
leftCtl: 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:  "IFUAsmStatus.StatusLatch3B",
type:   IFUPW.LISTn["GPLatch"],
top:  StatusLatch3BTop,
leftCtl: LIST["PhB", "VBB"],
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.