IFUAsmFetchIndexing.mesa
Copyright c 1985 by Xerox Corporation. All rights reserved.
Last Edited by Curry, January 7, 1986 7:32:39 pm PST
DIRECTORY
CD,
CDOrient,
Commander,
IFUAsm,
IFUPW,
PW,
Rope;
IFUAsmFetchIndexing: CEDAR PROGRAM
IMPORTS Commander, IFUAsm, IFUPW
EXPORTS IFUAsm =
BEGIN
GND: Rope.ROPE = IFUPW.GND;
VDD: Rope.ROPE = IFUPW.VDD;
fetchIndexingRP: IFUPW.RowParams ← NEW[IFUPW.RowParamsRec ←
[seq: TRUE, rngByte: 1, rngBit: 5]];
Four:    LIST OF REF = LIST[ LIST[GND, GND, VDD, GND, GND]];
AddrB:   LIST OF REF = LIST[ LIST[GND, GND, GND, "AddrB.36", "AddrB.37"]];
OpLengthAB: LIST OF REF = LIST[ LIST
[GND, GND, "OpLengthAB.0", "OpLengthAB.1", "OpLengthAB.2"] ];
RdLatchA: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmFetchIndexing.RdLatchA",
type:   IFUPW.LISTn["GPLatch"],
top:  NIL,
leftCtl: LIST["PhA", "VBB"],
in:   LIST["FetchRdBA."],
out:  LIST["RdAB." ],
bot:  LtArgFormTop,
rp:   fetchIndexingRP ]};
LtArgFormTop: LIST OF REF = IFUPW.LISTn[
"RdAB.",
"FetchRdBA.",
NIL ];
LtArgForm: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "IFUAsmFetchIndexing.LtArgForm",
top:  LtArgFormTop,
rightCtl: LIST["PhA", "PhB"],
in:   LIST["WtBA.", "RdAB."],
out:  LIST["LtArg."],
bot:  SwitchInOpLengthTop,
rp:   fetchIndexingRP ]};
SwitchInOpLengthTop: LIST OF REF = IFUPW.LISTn[
"RdAB.",
"FetchRdBA.",
NIL,
"WtBA.",
"LtArg." ];
SwitchInOpLength: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "IFUAsmFetchIndexing.SwitchInOpLength",
rowType: IFUPW.cmosMet2,
topRP:  fetchIndexingRP,
top:  SwitchInOpLengthTop,
left:  NIL,
right:  LIST["OpLengthAB.0", "OpLengthAB.1", "OpLengthAB.2"],
bot:  RtArgFormTop,
botRP:  fetchIndexingRP ]};
RtArgFormTop: LIST OF REF = IFUPW.LISTn[
"RdAB.",
"FetchRdBA.",
NIL,
"WtBA.",
"LtArg.",
NIL,
GND,
VDD,
OpLengthAB ];
RtArgForm: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "IFUAsmFetchIndexing.RtArgForm",
top:  RtArgFormTop,
rightCtl: LIST["PhA", "PhB"],
in:   LIST[Four, OpLengthAB],
out:  LIST["RtArg."],
bot:  AdderTop,
rp:   fetchIndexingRP ]};
AdderTop: LIST OF REF = IFUPW.LISTn[
"RdAB.",
"FetchRdBA.",
NIL,
"WtBA.",
"LtArg.",
"RtArg." ];
Adder: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmFetchIndexing.Adder",
type:   IFUPW.LISTn["GPAdder"],
top:  AdderTop,
rightCtl: LIST[GND],
in:   LIST["LtArg.", "RtArg."],
out:  LIST["Sum."],
bot:  SwitchInAddrBTop,
rp:   fetchIndexingRP ]};
SwitchInAddrBTop: LIST OF REF = IFUPW.LISTn[
"RdAB.",
"FetchRdBA.",
NIL,
"WtBA.",
NIL,
"Sum." ];
SwitchInAddrB: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "IFUAsmFetchIndexing.SwitchInAddrB",
rowType: IFUPW.cmosMet2,
topRP:  fetchIndexingRP,
top:  SwitchInAddrBTop,
left:  NIL,
right:  LIST["AddrB.36", "AddrB.37"],
bot:  RdMuxTop,
botRP:  fetchIndexingRP ]};
RdMuxTop: LIST OF REF = IFUPW.LISTn[
"RdAB.",
"FetchRdBA.",
NIL,
"WtBA.",
NIL,
"Sum.",
GND,
VDD,
AddrB ];
RdMux: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "IFUAsmFetchIndexing.RdMux",
top:  RdMuxTop,
rightCtl: LIST["NextInstrHoldBA", "NextInstrGetBA", "NextInstrJumpBA"],
in:   LIST["RdAB.", "Sum.", AddrB],
out:  LIST["RdB."],
bot:  RdLatchBTop,
rp:   fetchIndexingRP ]};
RdLatchBTop: LIST OF REF = IFUPW.LISTn[
NIL,
"FetchRdBA.",
NIL,
"WtBA.",
"RdB.",
"Sum." ];
RdLatchB: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmFetchIndexing.RdLatchB",
type:   IFUPW.LISTn["GPLatch"],
top:  RdLatchBTop,
leftCtl: LIST["PhB", "VBB"],
in:   LIST["RdB."],
out:  LIST["FetchRdBA." ],
bot:  WtMuxTop,
rp:   fetchIndexingRP ]};
WtMuxTop: LIST OF REF = IFUPW.LISTn[
NIL,
"FetchRdBA.",
NIL,
"WtBA.",
NIL,
"Sum." ];
WtMux: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUMuxRow[
design: design,
name:  "IFUAsmFetchIndexing.WtMux",
top:  WtMuxTop,
rightCtl: LIST["FetchWtCtlHoldBA", "FetchWtCtlIncrBA", "FetchWtCtlClearBA"],
in:   LIST["WtBA.", "Sum.", GND],
out:  LIST["WtA."],
bot:  WtLatchATop,
rp:   fetchIndexingRP ]};
WtLatchATop: LIST OF REF = IFUPW.LISTn[
NIL,
"FetchRdBA.",
NIL,
"WtBA.",
"WtA." ];
WtLatchA: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmFetchIndexing.WtLatchA",
type:   IFUPW.LISTn["GPLatch"],
top:  WtLatchATop,
leftCtl: LIST["PhA", "VBB"],
in:   LIST["WtA."],
out:  LIST["FetchWtAB." ],
bot:  WtLatchBTop,
rp:   fetchIndexingRP ]};
WtLatchBTop: LIST OF REF = IFUPW.LISTn[
NIL,
"FetchRdBA.",
"FetchWtAB.",
"WtBA.",
NIL ];
WtLatchB: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmFetchIndexing.WtLatchB",
type:   IFUPW.LISTn["GPLatch"],
top:  WtLatchBTop,
leftCtl: LIST["PhB", "VBB"],
in:   LIST["FetchWtAB."],
out:  LIST["WtBA." ],
bot:  WtInvertTop,
rp:   fetchIndexingRP ]};
WtInvertTop: LIST OF REF = IFUPW.LISTn[
NIL,
"FetchRdBA.",
"FetchWtAB." ];
WtInvert: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmFetchIndexing.WtInvert",
type:   IFUPW.LISTn["GPInv"],
top:  WtInvertTop,
in:   LIST["FetchWtAB."],
out:  LIST["NotFetchWtAB." ],
bot:  DiffAdderTop,
rp:   fetchIndexingRP ]};
PassBoxTop: LIST OF REF = IFUPW.LISTn[
NIL,
"FetchRdBA.",
"FetchWtAB.",
"NotFetchWtAB." ];
PassBox: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.SwitchBoxRow[
design: design,
name:  "IFUAsmFetchIndexing.PassBox",
rowType: IFUPW.cmosMet2,
topRP:  fetchIndexingRP,
top:  PassBoxTop,
left:   LIST["NotDrShData", "DrShA", "DrShB", "DrShWt", "DrShRd", "DrA", "DrB"],
right:  LIST["NotDrShData", "DrShA", "DrShB", "DrShWt", "DrShRd", "DrA", "DrB"],
bot:  DiffAdderTop,
botRP:  fetchIndexingRP ]};
DiffAdderTop: LIST OF REF = IFUPW.LISTn[
NIL,
"FetchRdBA.",
"FetchWtAB.",
"NotFetchWtAB." ];
DiffAdder: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell ← IFUPW.IFUGPCellRow[
design: design,
name:  "IFUAsmFetchIndexing.DiffAdder",
type:   IFUPW.LISTn["GPAdder"],
rightCtl: LIST[GND],
top:  DiffAdderTop,
in:   LIST["FetchRdBA.", "NotFetchWtAB."],
out:  LIST["FetchDiff."],
bot:  DiffAdderBot,
rp:   fetchIndexingRP ]};
DiffAdderBot: LIST OF REF = IFUPW.LISTn[
"FetchDiff.",
"FetchRdBA.",
"FetchWtAB." ];
module: Rope.ROPE ← "IFUAsmFetchIndexing";
FetchIndexing: PUBLIC IFUPW.Frame ← IFUPW.NFSFUP[module, y, LIST[
RdLatchA,
LtArgForm,
SwitchInOpLength,
RtArgForm,
Adder,
SwitchInAddrB,
RdMux,
RdLatchB,
WtMux,
WtLatchA,
WtLatchB,
WtInvert,
PassBox,
DiffAdder ],
CDOrient.rotate90 ];
FetchIndexingCT: Commander.CommandProc =
{IFUPW.AssembleFrame[IFUAsm.RefDesign[], FetchIndexing, cmd ] };
Commander.Register   [proc:   FetchIndexingCT, key: module];
END.