DIRECTORY Basics, Core, CoreFrame, CoreName, CoreXform, IFUSrc, IFUCoreData, IO, Rope;

IFUSrcControlPipe: CEDAR PROGRAM	
IMPORTS CoreFrame, CoreName, IFUCoreData, IO, Rope
EXPORTS IFUSrc =
BEGIN


ROPE:		TYPE = Core.ROPE;

Ph:		TYPE = CoreName.Ph;
xform:		CoreXform.Xform _ IFUCoreData.Interleaved48;
XBus:	ROPE = CoreName.RopeNm["XBus."];
GND:		ROPE = CoreName.RopeNm["GND"];
tKey:		ROPE _ CoreName.RopeNm["t"];
rKey:		ROPE _ CoreName.RopeNm["r"];
lKey:		ROPE _ CoreName.RopeNm["l"];


definitions: ARRAY [0..32) OF ROPE = [	
"l: EStkOverflow1BA	l: EStkOverflow2BA		",
"l: InstFault0BA			l: InstFault2BA		",
"r: KIsRtOp0BA			l: KIsRtOp1BA			",	-- to interlock
"r: FCtlIsRtOp0BA		l: FCtlIsRtOp1BA		",	-- to interlock

"r: Push0BA				t: Push1AB	l: Push2AB	l: Push3AB	",
"r: Pop0BA				t: Pop1AB 	t: Pop2AB	l: Pop3AB	",
"r: NotX2ALitSourceNone0BA	l: X2ASrcLit1BA	",
"r: X2ASrcStatus0BA			r: X2ASrcStatus1BA		",

"r: KPadsIn0BA			l: KPadsIn3BA			",
"r: InstStarting0BA		l: InstStarting2BA		",
"l: EUSt3AIsCBus1BA	t: EUSt3AIsCBus2BA	",
"t: DPCmnd0BA.7		r: EUWriteToPBus3AB ",

"t: EUAluOp0BA.0		r: EUAluOp2AB.0	",
"t: EUAluOp0BA.1		r: EUAluOp2AB.1	",
"t: EUAluOp0BA.2		r: EUAluOp2AB.2	",
"t: EUAluOp0BA.3		r: EUAluOp2AB.3	",


"r: CondEffect0BA.0 l: CondEffect1BA.0 l: CondEffect2BA.0
2Ax: VDD 2Bx: VDD 3Ax: VDD ",
"r: CondEffect0BA.1 l: CondEffect1BA.1 l: CondEffect2BA.1
2Ax: VDD 2Bx: VDD 3Ax: VDD ",

"r: CIsField0BA		l: CIsField2AB		l: CIsField3AB			",
"r: DPCmndIsRd0BA	l: DPCmndRd2BA	r: EURes3BisPBus3AB	",

"t: EUCondSel0BA.0 r: EUCondSel2AB.0 l: EUCondSel3AB.0 3Ax: EUCondSel2BA.0",
"t: EUCondSel0BA.1 r: EUCondSel2AB.1 l: EUCondSel3AB.1 3Ax: EUCondSel2BA.1",
"t: EUCondSel0BA.2 r: EUCondSel2AB.2 l: EUCondSel3AB.2 3Ax: EUCondSel2BA.2",
"t: EUCondSel0BA.3 r: EUCondSel2AB.3 l: EUCondSel3AB.3 3Ax: EUCondSel2BA.3",

"t: DPCmnd0BA.0		r: DPCmnd3AB.0	",
"t: DPCmnd0BA.1		r: DPCmnd3AB.1	",
"t: DPCmnd0BA.2		r: DPCmnd3AB.2	",
"t: DPCmnd0BA.3		r: DPCmnd3AB.3	",
"t: DPCmnd0BA.4		r: DPCmnd3AB.4	",
"t: DPCmnd0BA.5		r: DPCmnd3AB.5	",
"t: DPCmnd0BA.6		r: DPCmnd3AB.6	",
"t: DPCmnd0BA.7		r: DPCmnd3AB.7	" ];

forthByteBA:		ROPE = "(
EUSt3AIsCBus2BA
EUAluLeftSrc1BA.0		EUAluLeftSrc1BA.1
EUAluRightSrc1BA.0	EUAluRightSrc1BA.1 EUAluRightSrc1BA.2
EUStore2ASrc1BA.0		EUStore2ASrc1BA.1	)";

other0BLeftSignals:		LIST OF REF = LIST[
-- EUSt3AIsCBus2BA --
"EUAluLeftSrc1BA.0",	"EUAluLeftSrc1BA.1",
"EUAluRightSrc1BA.0",	"EUAluRightSrc1BA.1", "EUAluRightSrc1BA.2",
"EUStore2ASrc1BA.0",	"EUStore2ASrc1BA.1" ];


other0BRightSignals: LIST OF REF = LIST[
"PushPendingAB",	"PopPendingAB",
"AluOpBA.0",		"AluOpBA.1",		"AluOpBA.2",		"AluOpBA.3",		-- PreAluOp
"CondSelBA.0",	"CondSelBA.1",	"CondSelBA.2",	"CondSelBA.3",	-- PreCondSel
"DPCmndBA.0",	"DPCmndBA.1",	"DPCmndBA.2",	"DPCmndBA.3",	-- PreDPCmnd
"DPCmndBA.4",	"DPCmndBA.5",	"DPCmndBA.6",	"DPCmndBA.7" ];	-- PreDPCmnd

keySigs:	REF KeySigs _ MakeKeySigs[];
KeySigs:	TYPE = ARRAY [0..32) OF LIST OF KeySig;
KeySig:	TYPE = RECORD[key: ROPE, sig: CoreName.SigRec];

CP0BLeft:		LIST OF REF	_ BuildInList[cy: 0, ph: BA, side: left];
CP0BRight:		LIST OF REF	_ BuildInList[cy: 0, ph: BA, side: right];
CP1BLeft:		LIST OF REF	_ BuildInList[cy: 1, ph: BA, side: left];
CP1BRight:		LIST OF REF	_ BuildInList[cy: 1, ph: BA, side: right];

CPOutLeft:		LIST OF REF	_ BuildOutSide[side: left];
CPOutRight:	LIST OF REF	_ BuildOutSide[side: right];

CPPre1BAWd:	LIST OF REF	_ BuildWd[cy: 1, ph: BA, withoutFirst:TRUE, withoutLast:TRUE];
CP2AxWdNul:	LIST OF REF	_ BuildAltWd[key: "2Ax"];
CP2BxWdNul:	LIST OF REF	_ BuildAltWd[key: "2Bx"];
CP3AxWdNul:	LIST OF REF	_ BuildAltWd[key: "3Ax"];

orIn0:	ROPE = "
( NIL NIL NIL NIL	Push2AB		Push12AB		Pop1AB	Pop12AB )";
orIn1:	ROPE = "
( NIL NIL NIL NIL	Push1AB		Push3AB			Pop2AB	Pop3AB )";
orOut:	ROPE = "
( NIL NIL NIL NIL	Push12AB	PushPendingAB	Pop12AB	PopPendingAB )";
op47:	ROPE = "
(NIL NIL NIL NIL	OpBA.4			OpBA.5			OpBA.6			OpBA.7 )";
op57:	ROPE = "
(NIL NIL NIL NIL	GND				OpBA.5			OpBA.6			OpBA.7 )";
preAluOp0BA:	LIST OF ROPE _ LIST[
"NIL","NIL","NIL","NIL",
"AluOpBA.0","AluOpBA.1","AluOpBA.2","AluOpBA.3"];
euAluOp0B:		LIST OF ROPE  _ LIST[
"NIL","NIL","NIL","NIL",
"EUAluOp0B.0","EUAluOp0B.1","EUAluOp0B.2","EUAluOp0B.3"];
euAluOp0BA:		LIST OF ROPE  _ LIST[
"NIL","NIL","NIL","NIL",
"EUAluOp0BA.0","EUAluOp0BA.1","EUAluOp0BA.2","EUAluOp0BA.3"];
preCondSel0BA:	LIST OF ROPE _ LIST[
"NIL","NIL","NIL","NIL",
"CondSelBA.0","CondSelBA.1","CondSelBA.2","CondSelBA.3"];
euCondSel0B:	LIST OF ROPE _ LIST[
"NIL","NIL","NIL","NIL",
"EUCondSel0B.0","EUCondSel0B.1","EUCondSel0B.2","EUCondSel0B.3"];
euCondSel0BA:	LIST OF ROPE _ LIST[
"NIL","NIL","NIL","NIL",
"EUCondSel0BA.0","EUCondSel0BA.1","EUCondSel0BA.2","EUCondSel0BA.3"];
predpCmnd0BA:	LIST OF ROPE _ LIST[
"DPCmndBA.0","DPCmndBA.1","DPCmndBA.2","DPCmndBA.3",
"DPCmndBA.4","DPCmndBA.5","DPCmndBA.6","DPCmndBA.7"];
dpCmnd0B:	LIST OF ROPE _ LIST[
"DPCmnd0B.0","DPCmnd0B.1","DPCmnd0B.2","DPCmnd0B.3",
"DPCmnd0B.4","DPCmnd0B.5","DPCmnd0B.6","DPCmnd0B.7"];
dpCmnd0BA:	LIST OF ROPE _ LIST[
"DPCmnd0BA.0","DPCmnd0BA.1","DPCmnd0BA.2","DPCmnd0BA.3",
"DPCmnd0BA.4","DPCmnd0BA.5","DPCmnd0BA.6","DPCmnd0BA.7"];

dDataIn: ROPE = " (
(	DData.01	DData.05	DData.11	DData.15	DData.21	DData.25	DData.31	DData.35 )
(	DData.02	DData.06	DData.12	DData.16	DData.22	DData.26	DData.32	DData.36 )
(	DData.03	DData.07	DData.13	DData.17	DData.23	DData.27	DData.33	DData.37 )
(	DData.04	DData.10	DData.14	DData.20	DData.24	DData.30	DData.34 DShRightOut  ) )";
dDataOut: ROPE = " (
(DShOut	DData.04	DData.10	DData.14	DData.20	DData.24	DData.30	DData.34 )
(DData.01	DData.05	DData.11	DData.15	DData.21	DData.25	DData.31	DData.35 )
(DData.02	DData.06	DData.12	DData.16	DData.22	DData.26	DData.32	DData.36 )
(DData.03	DData.07	DData.13	DData.17	DData.23	DData.27	DData.33	DData.37 ) )";

CPShiftOp47Top:	LIST OF REF = LIST [
XBus,
LIST[ op47,	forthByteBA,	NIL,	"BetaBA." ] ];

CPShiftOp47: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"SwitchBox",
name:		"CPShiftOp47",
top:		CPShiftOp47Top,
left:		"( DShOut )",
right:		"( DShRightOut )",
bot:		CPShiftOp47Bot,
xform:		IFUCoreData.Interleaved48 ]};

CPShiftOp47Bot:	LIST OF REF = LIST [
XBus,
LIST[ NIL,	forthByteBA,	NIL,	"BetaBA." ],
LIST[ NIL,	op47,				op57,	NIL],
NIL,
dDataOut,
dDataIn ];

DebugShiftRegister: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"GPRow",
name:		"DataPathDebug",
type: 		"DpDebugRec",
top:		CPShiftOp47Bot,
left:		"( DShA DShRd DShB DShWt )",
right:		"( DShA DShRd DShB DShWt )",
in:			LIST[	dDataIn, "XBus." ],
out:		LIST[	dDataOut	],
bot:		CPMux0BTop,
xform:		IFUCoreData.Interleaved48 ]};

CPMux0BTop:	LIST OF REF = LIST [
XBus,
LIST[ NIL,	forthByteBA,	NIL,	"BetaBA." ],
LIST[ NIL,	op47,				op57,	NIL] ];

CPMux0B: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"Mux",
name:		"CPMux0B",
top:		CPMux0BTop,
right:		"(
AluOpIsOp47BA			NotAluOpIsOp47BA
CondSelIsOp57BA		NotCondSelIsOp57BA
DPCmndSelBetaBA		DPCmndSelNormalBA )",
in:			LIST[
LIST[ NIL, op47, NIL, NIL ],		LIST[ NIL, preAluOp0BA, NIL, NIL ],
LIST[ NIL, NIL, op57, NIL ],		LIST[ NIL, NIL, preCondSel0BA, NIL ],
LIST[ NIL, NIL, NIL, "BetaBA." ],	LIST[ NIL, NIL, NIL, predpCmnd0BA ] ],
out:		LIST[ LIST[ NIL, euAluOp0B, euCondSel0B, dpCmnd0B ] ],
bot:		CPLatch0BTop,
xform:		IFUCoreData.Interleaved48 ]};

CPLatch0BTop:	LIST OF REF = LIST [
XBus,
LIST[ NIL,	forthByteBA,	NIL,					NIL ],
NIL,
LIST[ NIL,	euAluOp0B,		euCondSel0B,		dpCmnd0B ],
LIST[ NIL,	preAluOp0BA,	preCondSel0BA,		predpCmnd0BA ] ];

CPLatch0B: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"GPRow",
name:		"CPLatch0B",
type: 		"( DpLatchOr DpLatch DpLatch DpLatch )",
left:		LIST["PhB", "VBB"],
top:		CPLatch0BTop,
in:			LIST[
LIST[ orIn0, euAluOp0B,	euCondSel0B,	dpCmnd0B ],
LIST[ orIn1, NIL,			NIL,				NIL ]],
out:		LIST[LIST[ orOut, euAluOp0BA,	euCondSel0BA,	dpCmnd0BA ]],
bot:		CPMergeInTop,
xform:		IFUCoreData.Interleaved48 ]};

CPMergeInTop:	LIST OF REF = LIST [
XBus,
LIST[ NIL,	forthByteBA,	NIL,					NIL ],
LIST[ orOut,	euAluOp0BA, euCondSel0BA, dpCmnd0BA ],
LIST[ orIn1,	NIL, NIL, NIL ],
LIST[ orIn0,	preAluOp0BA, preCondSel0BA, predpCmnd0BA ] ];

CPMergeIn: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"SwitchBox",
name:		"CPMergeIn",
top:		CPMergeInTop,
left:		CCat[ LIST[CP0BLeft,	CPOutLeft]], 
right:		CCat[ LIST[CP0BRight,	CPOutRight ] ], 
bot:		LIST[XBus, Conn[0,0,BA], NIL, Conn[1,0,BA], Conn[2,0,BA], Conn[3,0,BA]],
xform:		IFUCoreData.Interleaved48 ]};

CPLatch1A: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"GPRow",
name:		"CPLatch1A",
type: 		"DpLatch",
left:		LIST["LoadStage1Ac", "VBB"],
right:		LIST["LoadStage1Ac"],	-- for StatusControl
top:		LIST[XBus, Conn[0,0,BA], NIL, Conn[1,0,BA], Conn[2,0,BA], Conn[3,0,BA]],
in:			LIST[BuildWd[0, BA]],
out:		LIST[BuildWd[1, AB]],
bot:		LIST[XBus, Conn[0,1,AB], NIL, Conn[1,1,AB], Conn[2,1,AB], Conn[3,1,AB]],
xform:		IFUCoreData.Interleaved48 ]};

CPLatch1B: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"GPRow",
name:		"CPLatch1B",
type: 		"DpLatch",
left:		LIST["LoadStage1Bc", "VBB"],
right:		LIST["LoadStage1Bc"],	-- for StatusControl
top:		LIST[XBus, Conn[0,1,AB], NIL, Conn[1,1,AB], Conn[2,1,AB], Conn[3,1,AB]],
in:			LIST[BuildWd[1, AB]],
out:		LIST[BuildWd[cy: 1, ph: BA, withoutFirst:TRUE, withoutLast:FALSE]],
bot:		LIST[XBus, CPPre1BAWd, NIL, Conn[1,1,BA], Conn[2,1,BA], Conn[3,1,BA]],
xform:		IFUCoreData.Interleaved48 ]};

CPMergeIn1B: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"SwitchBox",
name:		"CPMergeIn1B",
top:		LIST[XBus, CPPre1BAWd, NIL, Conn[1,1,BA], Conn[2,1,BA], Conn[3,1,BA]],
left:		CP1BLeft,
right:		CP1BRight,
bot:		LIST[XBus, Conn[0,1,BA], NIL, Conn[1,1,BA], Conn[2,1,BA], Conn[3,1,BA]],
xform:		IFUCoreData.Interleaved48 ]};

CPMux2A: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"Mux",
name:		"CPMux2A",
top:		LIST[XBus, Conn[0,1,BA], NIL, Conn[1,1,BA], Conn[2,1,BA], Conn[3,1,BA]],
left:		LIST["Stage2ABubbleBA", "Stage2ANormalBA"],
in:			LIST[CP2AxWdNul, BuildWd[1, BA]],
out:		LIST[BuildWd[2, A]],
bot:		LIST[XBus, NIL, Conn[0,2,A], Conn[1,2,A], Conn[2,2,A], Conn[3,2,A]],
xform:		IFUCoreData.Interleaved48 ]};

CPLatch2A: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"GPRow",
name:		"CPLatch2A",
type: 		"DpLatch",
left:		LIST["LoadStage2Ac", "VBB"],
top:		LIST[XBus, NIL, Conn[0,2,A], Conn[1,2,A], Conn[2,2,A], Conn[3,2,A]],
in:			LIST[BuildWd[2, A]],
out:		LIST[BuildWd[2, AB]],
bot:		LIST[XBus, Conn[0,2,AB], NIL, Conn[1,2,AB], Conn[2,2,AB], Conn[3,2,AB]],
xform:		IFUCoreData.Interleaved48 ]};

CPMux2B: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"Mux",
name:		"CPMux2B",
top:		LIST[XBus, Conn[0,2,AB], NIL, Conn[1,2,AB], Conn[2,2,AB], Conn[3,2,AB]],
left:		LIST["Stage2BAbortAB", "Stage2BNormalAB"],
in:			LIST[CP2BxWdNul, BuildWd[2, AB]],
out:		LIST[BuildWd[2, B]],
bot:		LIST[XBus, NIL, Conn[0,2,B], Conn[1,2,B], Conn[2,2,B], Conn[3,2,B]],
xform:		IFUCoreData.Interleaved48 ]};

CPLatch2B: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"GPRow",
name:		"CPLatch2B",
type: 		"DpLatch",
left:		LIST["PhB", "VBB"],
top:		LIST[XBus, NIL, Conn[0,2,B], Conn[1,2,B], Conn[2,2,B], Conn[3,2,B]],
in:			LIST[BuildWd[2, B]],
out:		LIST[BuildWd[2, BA]],
bot:		LIST[XBus, Conn[0,2,BA], NIL, Conn[1,2,BA], Conn[2,2,BA], Conn[3,2,BA]],
xform:		IFUCoreData.Interleaved48 ]};

CPMux3A: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"Mux",
name:		"CPMux3A",
top:		LIST[XBus, Conn[0,2,BA], NIL, Conn[1,2,BA], Conn[2,2,BA], Conn[3,2,BA]],
left:		LIST["Stage3AAbortBA", "Stage3ANormalBA"],
in:			LIST[CP3AxWdNul, BuildWd[2, BA]],
out:		LIST[BuildWd[3, A]],
bot:		LIST[XBus, NIL, Conn[0,3,A], Conn[1,3,A], Conn[2,3,A], Conn[3,3,A]],
xform:		IFUCoreData.Interleaved48 ]};

CPLatch3A: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"GPRow",
name:		"CPLatch3A",
type: 		"DpLatch",
left:		LIST["LoadStage3Ac", "VBB"],
top:		LIST[XBus, NIL, Conn[0,3,A], Conn[1,3,A], Conn[2,3,A], Conn[3,3,A]],
in:			LIST[BuildWd[3, A]],
out:		LIST[BuildWd[3, AB]],
bot:		LIST[XBus, Conn[0,3,AB], NIL, Conn[1,3,AB], Conn[2,3,AB], Conn[3,3,AB]],
xform:		IFUCoreData.Interleaved48 ]};

CPLatch3B: PROC RETURNS[cellType: Core.CellType] = {
cellType _ IFUCoreData.CellProc[
subClass:	"GPRow",
name:		"CPLatch3B",
type: 		"DpLatch",
top:		LIST[XBus, Conn[0,3,AB], NIL, Conn[1,3,AB], Conn[2,3,AB], Conn[3,3,AB]],
left:		LIST["PhB", "VBB"],
in:			LIST[BuildWd[3, AB]],
out:		LIST[BuildWd[3, BA]],
bot:		LIST[XBus],
xform:		IFUCoreData.Interleaved48 ]};

MakeKeySigs: PROC RETURNS[keySigs:	REF KeySigs] = {
keySigs _ NEW[KeySigs _ ALL[NIL]];
FOR physical: INT IN [0..32) DO
logical:	INT _ physical;	-- need to match location of Op and beta for muxing
in:			IO.STREAM;
temp:		LIST OF KeySig;
IF definitions[physical] = NIL THEN LOOP;
in _ IO.RIS[definitions[physical]];
WHILE NOT in.EndOf[] DO
item:	ROPE;
keySig: KeySig;
keySig.key	_ CoreName.RopeNm[IO.GetTokenRope[in! IO.EndOfStream => EXIT].token];
item			_ CoreName.RopeNm[IO.GetTokenRope[in].token];
keySig.sig	_ CoreName.NameSig[item];
keySigs[logical]	_ CONS[keySig, keySigs[logical]]; ENDLOOP;
temp _ keySigs[logical]; keySigs[logical] _ NIL;
FOR temp _ temp, temp.rest WHILE temp#NIL
DO keySigs[logical] _ CONS[temp.first, keySigs[logical]] ENDLOOP;
ENDLOOP};

CompareSigToCyPh: PROC[sig: CoreName.SigRec, cy: INT, ph: Ph]
RETURNS[Basics.Comparison] = {
RETURN[ SELECT sig.cy FROM
> cy => greater,
< cy => less,
ENDCASE => SELECT sig.ph FROM
> ph => greater,
< ph => less,
ENDCASE => equal]};

BuildInList: PROC[cy: INT, ph: Ph, side: {left, right}] RETURNS[result: LIST OF REF] = {
IF cy=0 AND side=left THEN result _ other0BLeftSignals;
IF cy=0 AND side=right THEN result _ other0BRightSignals;
FOR bit: INT DECREASING IN [0..32) DO
IF keySigs[bit]=NIL THEN LOOP;
IF cy#keySigs[bit].first.sig.cy OR
ph#keySigs[bit].first.sig.ph THEN LOOP;
SELECT keySigs[bit].first.key FROM
tKey		=> LOOP;
lKey		=> IF side#left	THEN LOOP;
rKey 		=> IF side#right	THEN LOOP;
ENDCASE	=> LOOP;
result _ CONS[ CoreName.SigName[ keySigs[bit].first.sig ], result] ENDLOOP};

Signal: SIGNAL = CODE;

BuildWd: PROC[cy: INT, ph: Ph, withoutFirst, withoutLast: BOOL _ FALSE]
RETURNS[result: LIST OF REF] = {
FOR bit: INT IN [0..32) DO
last: KeySig;
IF keySigs[bit]=NIL THEN {result _ CONS[NIL, result]; LOOP};
FOR list: LIST OF KeySig _ keySigs[bit], list.rest WHILE list#NIL DO
SELECT list.first.key FROM	tKey, lKey, rKey => last _ list.first; ENDCASE => EXIT;
ENDLOOP;
IF 
CompareSigToCyPh[keySigs[bit].first.sig,	cy, ph]=greater OR
CompareSigToCyPh[keySigs[bit].first.sig,	cy, ph]=equal AND withoutFirst OR
CompareSigToCyPh[last.sig,				cy, ph]=less OR
CompareSigToCyPh[last.sig,				cy, ph]=equal AND withoutLast
THEN {result _ CONS[NIL, result]; LOOP};
last _ keySigs[bit].first;
FOR list: LIST OF KeySig _ keySigs[bit].rest, list.rest DO
IF list=NIL THEN GOTO finished;
SELECT list.first.key FROM	tKey, lKey, rKey => { }; ENDCASE => GOTO finished;
SELECT CompareSigToCyPh[list.first.sig, cy, ph] FROM
greater	=>	{last.sig.cy _ cy; last.sig.ph _ ph; EXIT};	-- preserve last name
less		=>	{last _ list.first; LOOP};						-- update last
ENDCASE	=>	{last _ list.first; EXIT};							-- use last
REPEAT finished => {result _ CONS[NIL, result]; LOOP} ENDLOOP;
result _ CONS[CoreName.SigName[last.sig], result];
ENDLOOP;
RETURN[ReversePartition[result]]};

BuildAltWd: PROC[key: ROPE] RETURNS[result: LIST OF REF] = {
key _ CoreName.RopeNm[key];
FOR bit: INT IN [0..32) DO
found: BOOL _ FALSE;
FOR list: LIST OF KeySig _ keySigs[bit], list.rest WHILE list#NIL DO
SELECT list.first.key FROM	tKey, lKey, rKey => LOOP; ENDCASE;
IF list.first.key=key THEN
{found_TRUE; result _ CONS[CoreName.SigName[list.first.sig], result]; EXIT};
ENDLOOP;
IF NOT found THEN result _ CONS[GND, result];
ENDLOOP;
RETURN[ReversePartition[result]]};

Conn: PROC[index, cy: INT, ph: Ph] RETURNS[result: LIST OF REF] = {
IF index=0 THEN RETURN[BuildWd[cy, ph, FALSE, TRUE]];
FOR bit: INT IN [0..32) DO
left: INT _ index;
found:	BOOL _ FALSE;
FOR list: LIST OF KeySig _ keySigs[bit], list.rest WHILE list#NIL DO
SELECT list.first.key FROM
tKey, lKey, rKey => {
IF left=0 THEN {
found_TRUE;
IF CompareSigToCyPh[list.first.sig, cy, ph] # greater
THEN	result _ CONS[NIL, result]
ELSE	result _ CONS[CoreName.SigName[list.first.sig], result];
EXIT};
left _ left-1};
ENDCASE => EXIT;
ENDLOOP;
IF NOT found THEN result _ CONS[NIL, result];
ENDLOOP;
RETURN[ReversePartition[result]]};

BuildOutSide: PROC[side: {left, right}] RETURNS[result: LIST OF REF] = {
FOR bit: INT IN [0..32) DO
IF keySigs[bit]=NIL THEN LOOP;
FOR list: LIST OF KeySig _ keySigs[bit].rest, list.rest WHILE list#NIL DO
SELECT list.first.key FROM
tKey	=> LOOP;
lKey	=> IF side=left	THEN result _ CONS[CoreName.SigName[list.first.sig], result];
rKey 	=> IF side=right	THEN result _ CONS[CoreName.SigName[list.first.sig], result];
ENDCASE	=> EXIT;
ENDLOOP;
ENDLOOP};

CCat: PROC[list: LIST OF REF] RETURNS[result: LIST OF REF _ NIL] = {
CCatRope: PROC[lst: LIST OF ROPE] = 
{IF lst=NIL THEN RETURN; CCatRope[lst.rest]; result _ CONS[lst.first, result]};
CCatMain: PROC[lst: LIST OF REF] = {
IF lst=NIL THEN RETURN;
CCatMain[lst.rest];
IF lst.first#NIL THEN WITH lst.first SELECT FROM
l:		LIST OF ROPE	=> CCatRope[l];
l:		LIST OF REF		=> CCatMain[l];
rope:	ROPE		=> result _ CONS[rope, result];
text:	REF TEXT		=> result _ CONS[Rope.FromRefText[text], result];
ENDCASE					=> ERROR};
CCatMain[list]};

ReversePartition: PROC[list: LIST OF REF] RETURNS[result: LIST OF REF _ NIL] = {
FOR byte: INT DECREASING IN [0..4) DO
bList: LIST OF REF _ NIL;
FOR bit: INT DECREASING IN [0..8) DO
bList _ CONS[list.first, bList];
list _ list.rest ENDLOOP;
result _ CONS[bList, result] ENDLOOP };

ControlPipe: PUBLIC PROC RETURNS[cellType: Core.CellType] = {
name:	ROPE _ CoreName.RopeNm["IFUControlPipe"];
IF (cellType _ CoreFrame.ReadFrameCache[name])=NIL THEN {
cellType _ CoreFrame.NewFrameCells[
name:		name,
rec:		[first: top],
cells: LIST[
CPShiftOp47[],
DebugShiftRegister[],
CPMux0B[],
CPLatch0B[],
CPMergeIn[],
CPLatch1A[],
CPLatch1B[],
CPMergeIn1B[],
CPMux2A[],
CPLatch2A[],
CPMux2B[],
CPLatch2B[],
CPMux3A[],
CPLatch3A[],
CPLatch3B[] 		] ];
CoreFrame.WriteFrameCache[cellType]}};

END. 


���|��mesa 
Copyright c 1986 by Xerox Corporation.  All rights reserved.
Curry, July 23, 1986 4:03:34 pm PDT
Assumption: Except for CondEffect, all abort values are Zero.
Non-zero alternate input IFUPLAMainControl.CondEffect[bubble]=3
See also IFUSrcABForm.forthByteBA
Sequencial in interleaved spec
logical:	INT _ CoreXform.XformIndex[IFUCoreData.Interleaved48, rl, physical].i;
Ê¢��˜�šœ™Icodešœ<™<K™#—J˜�JšÏk	œDœ˜VJ˜�šÏnœœœ˜!Jšœ#œ˜2Jšœ	˜Jš˜J˜�Jšœ=™=J˜�Jšœœœ˜J˜�Jšœœ˜Jšœ4˜4Jšžœœ˜&Jšœœ˜$Jšœœ˜#Jšœœ˜#Jšœœ˜#J˜�J˜�šœ
œ	œœ˜'Jšœ*˜*Jšœ&˜&Jšœ$Ïc˜3Jšœ(Ÿ˜7J˜�Jšœ2˜2Jšœ/˜/Jšœ-˜-Jšœ,˜,J˜�Jšœ#˜#Jšœ+˜+Jšœ)˜)Jšœ'˜'J˜�Jšœ$˜$Jšœ$˜$Jšœ$˜$Jšœ$˜$J˜�Jšœ?™?J˜�šœ9˜9Jšœœœœ˜—šœ9˜9Jšœœœœ˜—J˜�Jšœ4˜4Jšœ7˜7J˜�JšœL˜LJšœL˜LJšœL˜LJšœL˜LJ˜�Jšœ"˜"Jšœ"˜"Jšœ"˜"Jšœ"˜"Jšœ"˜"Jšœ"˜"Jšœ"˜"Jšœ$˜$—J˜�Jšœ!™!šœœ˜JšÏb˜Jšœ$˜$Jšœ8˜8Jšœ(˜(—J˜�š	œœœœœ˜(Jš ˜Jšœ)˜)JšœA˜AJšœ+˜+—J˜�J˜�š	œœœœœ˜(Jšœ ˜ Jšœ8Ÿ˜CJšœ<Ÿ
˜IJšœ8Ÿ˜DJšœ:Ÿ˜F—J˜�Jšœ	œ˜%Jšœ	œœ	œœœ˜0Jšœœœœ˜7J˜�Jš
žœœœœœ˜@Jš
ž	œœœœœ˜BJš
žœœœœœ˜@Jš
ž	œœœœœ˜BJ˜�Jšž	œœœœ˜3Jšž
œœœœ˜4J˜�Jšž
œœœœœœœ˜VJšž
œœœœ˜1Jšž
œœœœ˜1Jšž
œœœœ˜1J˜�šœœ˜Jš	œœœœœ&˜7—šœœ˜Jš	œœœœœ%˜6—šœœ˜Jš	œœœœœ0˜A—šœœ˜Jš	œœœœœ&˜6—šœœ˜Jšœœœœœœ ˜4—š	œ
œœœœ˜!Jšœ˜Jšœ1˜1—š	œœœœœ˜!Jšœ˜Jšœ9˜9—š	œ
œœœœ˜"Jšœ˜Jšœ=˜=—š	œœœœœ˜#Jšœ˜Jšœ9˜9—š	œ
œœœœ˜!Jšœ˜JšœA˜A—š	œœœœœ˜"Jšœ˜JšœE˜E—š	œœœœœ˜"Jšœ4˜4Jšœ5˜5—š	œ
œœœœ˜Jšœ4˜4Jšœ5˜5—š	œœœœœ˜Jšœ8˜8Jšœ9˜9—J˜�J™šœ	œ˜JšœK˜KJšœK˜KJšœK˜KJšœS˜S—šœ
œ˜JšœH˜HJšœJ˜JJšœJ˜JJšœN˜N—J˜�š
žœœœœœ˜$Jšœ˜Jšœœ˜,—J˜�šžœœœ˜6šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ%˜%——J˜�š
žœœœœœ˜$Jšœ˜Jšœœœ˜)Jšœœœ˜Jšœ˜Jšœ	˜	Jšœ
˜
—J˜�šžœœœ˜=šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ#˜#Jšœ$˜$Jšœœ˜Jšœœ
˜Jšœ˜Jšœ%˜%——J˜�š
ž
œœœœœ˜ Jšœ˜Jšœœœ˜)Jšœœœ˜!—J˜�šžœœœ˜2šœ ˜ Jšœ˜Jšœ˜Jšœ˜šœ
˜
Jšœ ˜ Jšœ#˜#Jšœ&˜&—šœœ˜Jšœœœœœœœœ˜AJšœœœœœœœœ˜CJšœœœœœœœœ˜H—Jšœœœœ'˜<Jšœ˜Jšœ%˜%——J˜�š
žœœœœœ˜"Jšœ˜Jšœœœœ˜'Jšœ˜Jšœœ'˜0Jšœœ0˜9—J˜�šž	œœœ˜4šœ ˜ Jšœ˜Jšœ˜Jšœ0˜0Jšœœ˜Jšœ˜šœœ˜Jšœ,˜0Jšœ	œœœ˜#—Jšœœœ0˜?Jšœ˜Jšœ%˜%——J˜�š
žœœœœœ˜"Jšœ˜Jšœœœœ˜'Jšœ/˜3Jšœ	œœœ˜Jšœ6˜:—J˜�šž	œœœ˜4šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ
œ˜)Jšœœ˜.Jš
œœœœœœœ˜NJšœ%˜%——J˜�šž	œœœ˜4šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœœ˜#Jšœœ&˜2Jš
œœœœœœœ˜NJšœœœ˜Jšœœœ˜Jš
œœœœœœœ˜NJšœ%˜%——J˜�šž	œœœ˜4šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœœ˜#Jšœœ&˜2Jš
œœœœœœœ˜NJšœœœ˜Jš	œœœœœ˜IJšœœœœœœ˜LJšœ%˜%——J˜�šžœœœ˜6šœ ˜ Jšœ˜Jšœ˜Jšœœœœœœ˜LJšœ˜Jšœ˜Jš
œœœœœœœ˜NJšœ%˜%——J˜�šžœœœ˜2šœ ˜ Jšœ˜Jšœ˜Jš
œœœœœœœ˜NJšœœ'˜2Jšœœœ˜'Jšœœ˜Jšœœœ6˜JJšœ%˜%——J˜�šž	œœœ˜4šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœœ˜#Jšœœœ6˜JJšœœ˜Jšœœœ˜Jš
œœœœœœœ˜NJšœ%˜%——J˜�šžœœœ˜2šœ ˜ Jšœ˜Jšœ˜Jš
œœœœœœœ˜NJšœœ&˜1Jšœœœ˜'Jšœœ˜Jšœœœ6˜JJšœ%˜%——J˜�šž	œœœ˜4šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœœ˜Jšœœœ6˜JJšœœ˜Jšœœœ˜Jš
œœœœœœœ˜NJšœ%˜%——J˜�šžœœœ˜2šœ ˜ Jšœ˜Jšœ˜Jš
œœœœœœœ˜NJšœœ&˜1Jšœœœ˜'Jšœœ˜Jšœœœ6˜JJšœ%˜%——J˜�šž	œœœ˜4šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœœ˜#Jšœœœ6˜JJšœœ˜Jšœœœ˜Jš
œœœœœœœ˜NJšœ%˜%——J˜�šž	œœœ˜4šœ ˜ Jšœ˜Jšœ˜Jšœ˜Jš
œœœœœœœ˜NJšœœ˜Jšœœœ˜Jšœœœ˜Jšœœ˜Jšœ%˜%——J˜�šžœœœ
œ
˜3Jšœ
œœœ˜"šœœœ	˜JšœO™OJšœ	œ
Ÿ3˜LJšœœœ˜Jšœœœ˜Jšœœœœ˜)Jšœœœ˜#šœœ˜Jšœœ˜Jšœ˜Jšœœœœ	˜PJšœœ˜4Jšœ$˜$Jšœœœ˜;—Jšœ,œ˜0šœœ˜)Jšœœœ˜A—Jšœ˜	——J˜�šžœœœ	˜=šœ˜šœœ˜Jšœ˜Jšœ
˜
šœœ˜Jšœ˜Jšœ
˜
Jšœ˜————J˜�šžœœœœ	œœœ˜XJšœœœ˜7Jšœœœ˜9š	œœ
œœ	˜%Jšœœœœ˜šœ˜"Jšœœœ˜'—šœ˜"Jšœ	œ˜Jšœ	œœœ˜ Jšœ
œœœ˜"Jšœœ˜—Jšœ	œ6œ˜L——J˜�šžœœœ˜J˜�—š
žœœœ%œœ˜GJšœ	œœœ˜ šœœœ	˜Jšœ
˜
Jšœœœœœœ˜<šœœœ"œœ˜DJšœœ(œœ˜RJšœ˜—šœ˜Jšœ9˜;Jšœ7œ˜JJšœ+˜-šœ,œ˜;Jšœœœœ˜(——Jšœ˜šœœœ'˜:Jšœœœœ
˜Jšœœœœ
˜Mšœ*˜4Jšœ0œŸ˜LJšœœŸ˜7Jšœœ	Ÿ˜7—Jš
œœœœœ˜>—Jšœ	œ%˜2Jšœ˜—šœ˜"J˜�——šž
œœœœ	œœœ˜<Jšœ˜šœœœ	˜Jšœœœ˜šœœœ"œœ˜DJšœœœœ˜=šœ˜Jšœœœ,œ˜L—Jšœ˜—Jš
œœœ
œœ
˜-Jšœ˜—šœ˜"J˜�——šžœœœ
œ	œœœ˜CJš
œ	œœœœ˜5šœœœ	˜Jšœœ	˜Jšœœœ˜šœœœ"œœ˜Dšœ˜šœ˜šœœ˜Jšœœ˜šœ3˜5Jšœ
œœ	˜Jšœ
œ+˜=—Jšœ˜—Jšœ˜—Jšœœ˜—Jšœ˜—Jš
œœœ
œœ
˜-Jšœ˜—Jšœ˜"J˜�—šžœœœ	œœœ˜Hšœœœ	˜Jšœœœœ˜šœœœ'œœ˜Išœ˜Jšœœ˜
Jšœœœ
œ+˜RJšœ	œœ
œ+˜TJšœœ˜—Jšœ˜—Jšœ˜	——J˜�šžœœœœœœ	œœœœ˜Dš
žœœœœœ˜$Jšœœœœœœ˜O—š
žœœœœœ˜$Jšœœœœ˜Jšœ˜šœœœœœ˜0Jšœœœœ˜ Jšœœœœ˜ Jšœœœ˜+Jšœœœœ!˜AJšœœ˜——Jšœ˜J˜�—šžœœœœœœ	œœœœ˜Pš	œœ
œœ˜%Jš	œœœœœ˜š	œœ
œœ˜$Jšœœ˜ Jšœœ˜—Jšœ	œœ˜'—J˜�—šžœœœœ˜=Jšœœ%˜/šœ-œœ˜9šœ#˜#Jšœ˜Jšœ˜šœœ˜Jšœ˜Jšœ˜Jšœ
˜
Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ
˜
Jšœ˜Jšœ
˜
Jšœ˜Jšœ
˜
Jšœ˜Jšœ˜——Jšœ&˜&——J˜�Jšœ˜—J˜�J˜�—�…—����Hˆ��c¦��