IFUAsmFetch:
CEDAR
PROGRAM
IMPORTS Commander, IFUAsm, IFUPW
EXPORTS IFUAsm =
BEGIN
GND: Rope.ROPE = IFUPW.GND;
VDD: Rope.ROPE = IFUPW.VDD;
IPBusLeft: IFUPW.List = LIST
["IPBus.00","IPBus.01","IPBus.02","IPBus.03","IPBus.04","IPBus.05","IPBus.06","IPBus.07"];
IPBusRight: IFUPW.List = LIST
["IPBus.37","IPBus.36","IPBus.35","IPBus.34","IPBus.33","IPBus.32","IPBus.31","IPBus.30"];
IPBusMiddle: LIST OF REF = LIST[
LIST["IPBus.10", NIL, "IPBus.11", NIL, "IPBus.12", NIL, "IPBus.13", NIL],
LIST["IPBus.14", NIL, "IPBus.15", NIL, "IPBus.16", NIL, "IPBus.17", NIL],
LIST["IPBus.20", NIL, "IPBus.21", NIL, "IPBus.22", NIL, "IPBus.23", NIL],
LIST["IPBus.24", NIL, "IPBus.25", NIL, "IPBus.26", NIL, "IPBus.27", NIL ] ];
IPBus:
LIST
OF
REF =
LIST[
LIST[ "IPBus.00", "IPBus.10", "IPBus.20", "IPBus.30",
"IPBus.01", "IPBus.11", "IPBus.21", "IPBus.31"],
LIST[ "IPBus.02", "IPBus.12", "IPBus.22", "IPBus.32",
"IPBus.03", "IPBus.13", "IPBus.23", "IPBus.33"],
LIST[ "IPBus.04", "IPBus.14", "IPBus.24", "IPBus.34",
"IPBus.05", "IPBus.15", "IPBus.25", "IPBus.35"],
LIST[ "IPBus.06", "IPBus.16", "IPBus.26", "IPBus.36",
"IPBus.07", "IPBus.17", "IPBus.27", "IPBus.37"] ];
FetchPBusXsformTop: LIST OF REF = IFUPW.LISTn[
NIL,
NIL,
NIL,
NIL,
NIL,
NIL,
GND,
VDD,
IPBusMiddle];
FetchPBusXsform: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name: "IFUAsmFetch.FetchPBusXsform",
rowType: IFUPW.cmosMet2,
topRP: IFUPW.IFUDataColSeq,
top: FetchPBusXsformTop,
left: IPBusLeft,
right: IPBusRight,
bot: FetchPBusXsformBot,
botRP: IFUPW.IFUDataColSeq ]};
FetchPBusXsformBot:
LIST
OF
REF =
IFUPW.LISTn[
NIL,
NIL,
NIL,
IPBus,
"IPBus."];
Rename sequencial version fo IPBus to IPBusAddr
FetchIncrementTop:
LIST
OF
REF =
IFUPW.LISTn[
NIL,
NIL,
NIL,
IPBus,
"IPBus."];
FetchIncrement:
PROC[design:
CD.Design]
RETURNS[cell:
CD.Object] = {
cell ←
IFUPW.IFUAdderRow[
design: design,
name: "IFUAsmFetch.FetchIncrement",
rightCtl: LIST[GND],
top: FetchIncrementTop,
in: IFUPW.LISTn[ "FetchAddrBA.", IncrePCBA],
out: IFUPW.LISTn[ "FetchAddrPlus4BA."],
bot: FetchIncrementInBot,
sums: 1,
rp: IFUPW.IFUDataColSeq ]};
IncrePCBA:
LIST
OF
REF =
IFUPW.LISTn[
GND,
GND,
GND,
IFUPW.LISTn[GND, GND, GND, GND, GND, "IncrePCBA", GND, GND ]];
FetchIncrementInBot:
LIST
OF
REF =
IFUPW.LISTn[
"FetchAddrBA.",
IncrePCBA,
"FetchAddrPlus4BA.",
IPBus,
"IPBus." ];
Rename sequencial version fo IPBus to IPBusAddr
FetchIncrementInTop:
LIST
OF
REF =
IFUPW.LISTn[
"FetchAddrBA.",
IncrePCBA,
"FetchAddrPlus4BA.",
IPBus,
"IPBusAddr." ];
FetchIncrementIn:
PROC[design:
CD.Design]
RETURNS[cell:
CD.Object] = {
cell ←
IFUPW.SwitchBoxRow[
design: design,
name: "IFUAsmFetch.FetchIncrementIn",
rowType: IFUPW.cmosMet2,
topRP: IFUPW.IFUDataColSeq,
top: FetchIncrementInTop,
left: LIST["IncrePCBA"],
right: NIL,
bot: FetchLatchATop,
botRP: IFUPW.IFUDataColSeq ]};
FetchLatchATop:
LIST
OF
REF =
IFUPW.LISTn[
"FetchAddrBA.",
NIL,
"FetchAddrPlus4BA.",
IPBus,
"IPBusAddr."];
FetchLatchA:
PROC[design:
CD.Design]
RETURNS[cell:
CD.Object] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "IFUAsmFetch.FetchLatchA",
type: IFUPW.LISTn["GPLatch"],
top: FetchLatchATop,
leftCtl: LIST["PhA", "VBB"],
in: IFUPW.LISTn["FetchAddrPlus4BA."],
out: IFUPW.LISTn["FetchAddrAB."],
bot: FetchMuxBTop,
rp: IFUPW.IFUDataColSeq ]};
FetchMuxBTop:
LIST
OF
REF =
IFUPW.LISTn[
"FetchAddrBA.",
"FetchAddrAB.",
NIL,
IPBus,
"IPBusAddr."];
FetchMuxB:
PROC[design:
CD.Design]
RETURNS[cell:
CD.Object] = {
cell ←
IFUPW.IFUMuxRow[
design: design,
name: "IFUAsmFetch.FetchMuxB",
top: FetchMuxBTop,
rightCtl: LIST["MacroJumpBA", "not.MacroJumpBA"],
in: IFUPW.LISTn["PCBus.", "FetchAddrAB."],
out: IFUPW.LISTn["FetchAddrB."],
bot: FetchLatchBTop,
rp: IFUPW.IFUDataColSeq ]};
FetchLatchBTop:
LIST
OF
REF =
IFUPW.LISTn[
"FetchAddrBA.",
NIL,
"FetchAddrB.",
IPBus,
"IPBusAddr.",
"PCBus."];
FetchLatchB:
PROC[design:
CD.Design]
RETURNS[cell:
CD.Object] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "IFUAsmFetch.FetchLatchB",
type: IFUPW.LISTn["GPLatch"],
top: FetchLatchBTop,
leftCtl: LIST["PhB", "VBB"],
in: IFUPW.LISTn["FetchAddrB."],
out: IFUPW.LISTn["FetchAddrBA."],
bot: FetchShiftAddress2Top,
rp: IFUPW.IFUDataColSeq ]};
FetchShiftAddress2Top:
LIST
OF
REF =
IFUPW.LISTn[
"FetchAddrBA.",
NIL,
NIL,
IPBus,
"IPBusAddr.",
"PCBus."];
FetchShiftAddress2:
PROC[design:
CD.Design]
RETURNS[cell:
CD.Object] = {
cell ←
IFUPW.SwitchBoxRow[
design: design,
name: "IFUAsmFetch.FetchShiftAddress2",
rowType: IFUPW.cmosMet2,
topRP: IFUPW.IFUDataColSeq,
top: FetchShiftAddress2Top,
left: LIST["FetchAddrBA.36", "FetchAddrBA.37"],
right: NIL,
bot: FetchFetchIPDriveTop,
botRP: IFUPW.IFUDataColSeq ]};
fetchAddrShift2BA:
LIST
OF
REF =
IFUPW.LISTn[
IFUPW.LISTn[
GND, GND, "FetchAddrBA.00", "FetchAddrBA.01",
"FetchAddrBA.02", "FetchAddrBA.03", "FetchAddrBA.04", "FetchAddrBA.05"],
IFUPW.LISTn[
"FetchAddrBA.06", "FetchAddrBA.07", "FetchAddrBA.10", "FetchAddrBA.11",
"FetchAddrBA.12", "FetchAddrBA.13", "FetchAddrBA.14", "FetchAddrBA.15"],
IFUPW.LISTn[
"FetchAddrBA.16", "FetchAddrBA.17", "FetchAddrBA.20", "FetchAddrBA.21",
"FetchAddrBA.22", "FetchAddrBA.23", "FetchAddrBA.24", "FetchAddrBA.25"],
IFUPW.LISTn[
"FetchAddrBA.26", "FetchAddrBA.27", "FetchAddrBA.30", "FetchAddrBA.31",
"FetchAddrBA.32", "FetchAddrBA.33", "FetchAddrBA.34", "FetchAddrBA.35"]];
FetchFetchIPDriveTop:
LIST
OF
REF =
IFUPW.LISTn[
NIL,
NIL,
fetchAddrShift2BA,
IPBus,
"IPBusAddr.",
"PCBus."];
FetchIPDrive:
PROC[design:
CD.Design]
RETURNS[cell:
CD.Object] = {
cell ←
IFUPW.IFUGPCellRow[
design: design,
name: "IFUAsmFetch.FetchIPDrive",
type: IFUPW.LISTn["GPTriDr"],
top: FetchFetchIPDriveTop,
leftCtl: LIST["PhA", "not.PhA"],
in: IFUPW.LISTn[fetchAddrShift2BA],
out: IFUPW.LISTn["IPBusAddr."],
bot: FetchXslatePCBusTop,
rp: IFUPW.IFUDataColSeq ]};
FetchXslatePCBusTop:
LIST
OF
REF =
IFUPW.LISTn[
NIL,
NIL,
NIL,
IPBus,
NIL,
"PCBus.",
GND,
VDD];
FetchXslatePCBus:
PROC[design:
CD.Design]
RETURNS[cell:
CD.Object] = {
cell ←
IFUPW.SwitchBoxRow[
design: design,
name: "IFUAsmFetch.FetchXslatePCBus",
rowType: IFUPW.cmosMet2,
topRP: IFUPW.IFUDataColNSeq,
top: FetchXslatePCBusTop,
left: NIL,
right: NIL,
bot: FetchAddressBot,
botRP: IFUPW.IFUDataColNSeq ]};
FetchAddressBot:
LIST
OF
REF =
IFUPW.LISTn[
NIL,
NIL,
NIL,
"IPBus.",
NIL,
NIL,
GND,
VDD,
"PCBus."];
module: Rope.ROPE ← "IFUAsmFetch";
Fetch: PUBLIC IFUPW.Frame ← NIL;
Fetch:
PUBLIC
IFUPW.Frame ←
IFUPW.
NFSFUP[module, y,
LIST[
FetchPBusXsform,
FetchIncrement,
FetchIncrementIn,
FetchLatchA,
FetchMuxB,
FetchLatchB,
FetchShiftAddress2,
FetchIPDrive,
FetchXslatePCBus ] ];