DIRECTORY 
CD,
Commander,
IFUAsm,
IFUPW,
Rope;

IFUAsmControlPipe: CEDAR PROGRAM	
IMPORTS Commander, IFUAsm, IFUPW, Rope
EXPORTS IFUAsm =
BEGIN

GND: Rope.ROPE = IFUPW.GND;
VDD: Rope.ROPE = IFUPW.VDD;
XBus: Rope.ROPE = "XBus.";

cpRP: IFUPW.RowParams = IFUPW.IFUDataColNSeq;

Field: TYPE = {name, in, out0, out1, out2}; 

signals: ARRAY [0..32) OF ARRAY Field OF Rope.ROPE = [
["Push",				"0BA",	"1BA",	"2BA",	"3BA"],
["Pop",				"0BA",	"1BA",	"2BA",	"3BA"],
["DrXa2Lev",			"0BA",	"1BA",	NIL,		NIL],
[NIL,					NIL,		NIL,		NIL,		NIL],

["EUAluOp.0",		"0BA",	"2AB",	NIL,		NIL],
["EUAluOp.1",		"0BA",	"2AB",	NIL,		NIL],
["EUAluOp.2",		"0BA",	"2AB",	NIL,		NIL],
["EUAluOp.3",		"0BA",	"2AB",	NIL,		NIL],

["EUCondSel.0",		"0BA",	"2AB",	NIL,		NIL],
["EUCondSel.1",		"0BA",	"2AB",	NIL,		NIL],
["EUCondSel.2",		"0BA",	"2AB",	NIL,		NIL],
["EUCondSel.3",		"0BA",	"2AB",	NIL,		NIL],

["DPCmnd.0",		"0BA",	"2BA",	NIL,		NIL],
["DPCmnd.1",		"0BA",	"2BA",	NIL,		NIL],
["DPCmnd.2",		"0BA",	"2BA",	NIL,		NIL],
["DPCmnd.3",		"0BA",	"2BA",	NIL,		NIL],

["EUCondEffect.0",	"0BA",	"2BA",	NIL,		NIL],
["EUCondEffect.1",	"0BA",	"2BA",	NIL,		NIL],
["EUSt3AisCBus",	"1A",		"2BA",	NIL,		NIL],
["EURes3AisCBus",	"1A",		"2BA",	NIL,		NIL],

["EUWriteToPBus",	"0BA",	"3AB",	NIL,		NIL],
["EURes3BisPBus",	"1A",		"3AB",	NIL,		NIL],
[NIL,					NIL,		NIL,		NIL,		NIL],
[NIL,					NIL,		NIL,		NIL,		NIL],

["EUAluLeftSrc.0",	"1A",		"1BA",	NIL,		NIL],
["EUAluLeftSrc.1",	"1A",		"1BA",	NIL,		NIL],
["EUAluRightSrc.0",	"1A",		"1BA",	NIL,		NIL],
["EUAluRightSrc.1",	"1A",		"1BA",	NIL,		NIL],
["EUStore2ASrc.0",	"1A",		"1BA",	NIL,		NIL],
["EUStore2ASrc.1",	"1A",		"1BA",	NIL,		NIL],
[NIL,					NIL,		NIL,		NIL,		NIL],
[NIL,					NIL,		NIL,		NIL,		NIL] ];

CPInList:			IFUPW.List	= BuildList[in];
CPOutList:		IFUPW.List	= BuildList[out];

CPInWd:			LIST OF REF	= BuildWd[NIL,		in];
CP1ABWd:		LIST OF REF	= BuildWd["1AB"];
CP1BxWd:		LIST OF REF	= BuildWd["1Bx"];
CP1BAWd:		LIST OF REF	= BuildWd["1BA"];
CP2AxWd:		LIST OF REF	= BuildWd["2Ax"];
CP2ABWd:		LIST OF REF	= BuildWd["2AB"];
CP2BAWd:		LIST OF REF	= BuildWd["2BA"];
CP3AxWd:		LIST OF REF	= BuildWd["3Ax"];
CP3ABWd:		LIST OF REF	= BuildWd["3AB"];
CP3BAWd:		LIST OF REF	= BuildWd["3BA"];
CPOut0Wd:		LIST OF REF	= BuildWd[NIL,		out0];
CPOut1Wd:		LIST OF REF	= BuildWd[NIL,		out1];
CPOut2Wd:		LIST OF REF	= BuildWd[NIL,		out2];

euDControls:	IFUPW.List = IFUPW.List8[
"EUAluLeftSrc1BA.0",	"EUAluLeftSrc1BA.1",
"EUAluRightSrc1BA.0",	"EUAluRightSrc1BA.1",
"EUStore2ASrc1BA.0",	"EUStore2ASrc1BA.1",
NIL, NIL];

CPSwitchInTop: LIST OF REF = IFUPW.LISTn[
"XBus.",
NIL,
NIL,
LIST[NIL, NIL, NIL,  euDControls]];


CPSwitchIn: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.SwitchBoxRow[
design:	design,
name:		"IFUAsmControlPipe.CPSwitchIn",
rowType:	IFUPW.cmosMet2,
topRP:	cpRP,
top:		CPSwitchInTop,
left:		CPInList,
right:		CPOutList,
bot:		LIST[XBus, CPInWd, NIL, CPOut0Wd, CPOut1Wd, CPOut2Wd],
botRP:		cpRP ]};

CPLatch1A: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.IFUGPCellRow[
design:	design,
name:		"IFUAsmControlPipe.CPLatch1A",
type: 		IFUPW.LISTn["GPLatch"],
leftCtl:	LIST["PhA", "VBB"],
top:		LIST[XBus, CPInWd, NIL, CPOut0Wd, CPOut1Wd, CPOut2Wd],
in:			LIST[CPInWd],
out:		LIST[CP1ABWd],
bot:		LIST[XBus, CP1ABWd, NIL, CPOut0Wd, CPOut1Wd, CPOut2Wd],
rp:			cpRP ]};

CPMux1AB: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.IFUMuxRow[
design:	design,
name:		"IFUAsmControlPipe.CPMux1AB",
top:		LIST[XBus, CP1ABWd, NIL, CPOut0Wd, CPOut1Wd, CPOut2Wd],
leftCtl:	LIST["Pipe1KillAB", "Pipe1AdvAB"],
in:			LIST[GND, CP1ABWd],
out:		LIST[CP1BxWd],
bot:		LIST[XBus, NIL, CP1BxWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
rp:			cpRP ]};

CPLatch1B: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.IFUGPCellRow[
design:	design,
name:		"IFUAsmControlPipe.CPLatch1B",
type: 		IFUPW.LISTn["GPLatch"],
leftCtl:	LIST["NotPipe1CycBc", "VBB"],
top:		LIST[XBus, CP1BAWd, CP1BxWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
in:			LIST[CP1BxWd],
out:		LIST[CP1BAWd],
bot:		LIST[XBus, CP1BAWd, NIL, CPOut0Wd, CPOut1Wd, CPOut2Wd],
rp:			cpRP ]};

CPMux1BA: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.IFUMuxRow[
design:	design,
name:		"IFUAsmControlPipe.CPMux1BA",
top:		LIST[XBus, CP1BAWd, NIL, CPOut0Wd, CPOut1Wd, CPOut2Wd],
leftCtl:	LIST["Pipe2CycAB", "Pipe2KillAB", "Pipe2AdvAB"],
in:			LIST[CP2BAWd, GND, CP1BAWd],
out:		LIST[CP2AxWd],
bot:		LIST[XBus, CP2BAWd, CP2AxWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
rp:			cpRP ]};

CPLatch2A: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.IFUGPCellRow[
design:	design,
name:		"IFUAsmControlPipe.CPLatch2A",
type: 		IFUPW.LISTn["GPLatch"],
leftCtl:	LIST["PhA", "VBB"],
top:		LIST[XBus, CP2BAWd, CP2AxWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
in:			LIST[CP2AxWd],
out:		LIST[CP2ABWd],
bot:		LIST[XBus, CP2BAWd, CP2ABWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
rp:			cpRP ]};

CPLatch2B: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.IFUGPCellRow[
design:	design,
name:		"IFUAsmControlPipe.CPLatch2B",
type: 		IFUPW.LISTn["GPLatch"],
leftCtl:	LIST["PhB", "VBB"],
top:		LIST[XBus, CP2BAWd, CP2ABWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
in:			LIST[CP2ABWd],
out:		LIST[CP2BAWd],
bot:		LIST[XBus, CP2BAWd, NIL, CPOut0Wd, CPOut1Wd, CPOut2Wd],
rp:			cpRP ]};

CPMux3A: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.IFUMuxRow[
design:	design,
name:		"IFUAsmControlPipe.CPMux3A",
top:		LIST[XBus, CP2BAWd, NIL, CPOut0Wd, CPOut1Wd, CPOut2Wd],
leftCtl:	LIST["Pipe3CycAB", "Pipe3TrapAB", "Pipe3FaultAB", "Pipe3AdvAB"],
in:			LIST[CP3BAWd, GND, GND, CP2BAWd],
out:		LIST[CP3AxWd],
bot:		LIST[XBus, CP3BAWd, CP3AxWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
rp:			cpRP ]};

CPLatch3A: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.IFUGPCellRow[
design:	design,
name:		"IFUAsmControlPipe.CPLatch3A",
type: 		IFUPW.LISTn["GPLatch"],
leftCtl:	LIST["PhA", "VBB"],
top:		LIST[XBus, CP3BAWd, CP3AxWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
in:			LIST[CP3AxWd],
out:		LIST[CP3ABWd],
bot:		LIST[XBus, CP3BAWd, CP3ABWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
rp:			cpRP ]};

CPLatch3B: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.IFUGPCellRow[
design:	design,
name:		"IFUAsmControlPipe.CPLatch3B",
type: 		IFUPW.LISTn["GPLatch"],
top:		LIST[XBus, CP3BAWd, CP3ABWd, CPOut0Wd, CPOut1Wd, CPOut2Wd],
leftCtl:	LIST["PhB", "VBB"], 
in:			LIST[CP3ABWd],
out:		LIST[CP3BAWd],
bot:		LIST[XBus, CP3BAWd, NIL, CPOut0Wd, CPOut1Wd, CPOut2Wd],
rp:			cpRP ]};



CPXBusXsformTop: LIST OF REF = IFUPW.LISTn[
"XBus."];

CPXBusXsform: PROC[design: CD.Design] RETURNS[cell: CD.Object] = {
cell _ IFUPW.SwitchBoxRow[
design:	design,
name:		"IFUAsmControlPipe.CPXBusXsform",
rowType:	IFUPW.cmosMet2,
topRP:		cpRP,
top:		CPXBusXsformTop,
left:		NIL,
right:		NIL,
bot:		CPXBusXsformBot,
botRP:		IFUPW.IFUDataColSeq ]};

CPXBusXsformBot: LIST OF REF = IFUPW.LISTn[
"XBus."];



AddRopeToRoot: PROC[rope, root: Rope.ROPE] RETURNS[new: Rope.ROPE] = {
index:	INT			_ Rope.Index[root, 0, "."];
ext:	Rope.ROPE	_ Rope.Substr[root,	index];
IF root=NIL OR rope=NIL THEN RETURN[NIL];
new	_ Rope.Cat[Rope.Substr[root, 0, index], rope, ext]};

BuildWd: PROC[rope: Rope.ROPE, ropeField: Field _ in]
RETURNS[list: LIST OF REF] = {
FOR byte: INT DECREASING IN [0..cpRP.rngByte) DO
blist: LIST OF REF _ NIL;
FOR bit: INT DECREASING IN [0..cpRP.rngBit) DO
index: INT _ byte*cpRP.rngBit + bit;
suffix: Rope.ROPE _ IF rope # NIL THEN rope ELSE signals[index][ropeField];
blist _ CONS[AddRopeToRoot[suffix, signals[index][name]], blist] ENDLOOP;
list _ CONS[blist, list] ENDLOOP };

BuildList: PROC[inout: {in, out}] RETURNS[list: IFUPW.List] = {
Add: PROC[lst: IFUPW.List, field: Field] RETURNS[IFUPW.List] = {
fieldRope: Rope.ROPE _ signals[index][field];
IF root = NIL OR fieldRope=NIL THEN RETURN[lst];
RETURN[CONS[AddRopeToRoot[fieldRope, root], lst]]};
index: INT;
root: Rope.ROPE;
FOR index IN [0..cpRP.rngByte* cpRP.rngBit) DO
root _ signals[index][name];
IF inout = in
THEN	{list _ Add[list, in]}
ELSE	{list _ Add[list, out0];	list _ Add[list, out1];	list _ Add[list, out2]};	
 ENDLOOP };

CatList: PROC[list1, list2: IFUPW.List] RETURNS[new: IFUPW.List] = {
IF list1=NIL THEN RETURN[list2];
new _ CatList[list1.rest, list2];
new _ CONS[list1.first, new] };

module:		Rope.ROPE _ "IFUAsmControlPipe";

ControlPipe: PUBLIC IFUPW.Frame _ IFUPW.NFSFUP[module, y, LIST[
CPSwitchIn,
CPLatch1A,
CPMux1AB,
CPLatch1B,
CPMux1BA,
CPLatch2A,
CPLatch2B,
CPMux3A,
CPLatch3A,
CPLatch3B,
CPXBusXsform ] ];

ControlPipeCT:	Commander.CommandProc	=
{IFUPW.AssembleFrame[IFUAsm.RefDesign[], ControlPipe, cmd ] };

Commander.Register			[proc:			ControlPipeCT,	key:	module];




END. 
��¦��IFUAsmControlPipe.mesa 
Copyright c 1985 by Xerox Corporation.  All rights reserved.
Last Edited by July 3, 1985 10:43:26 am PDT
Curry, January 24, 1986 5:08:53 pm PST

Drop all but XBus here	**********************************************
XBusLeft: IFUPW.List = LIST[
"XBus.00","XBus.01","XBus.02","XBus.03","XBus.04","XBus.05","XBus.06","XBus.07",	-- pads
"XBus.10","XBus.11","XBus.12","XBus.13","XBus.14","XBus.15","XBus.16","XBus.17",	-- decode
"XBus.20","XBus.21","XBus.22","XBus.23","XBus.24","XBus.25","XBus.26","XBus.27"];	-- decode
XBusRight: IFUPW.List = LIST
["XBus.37","XBus.36","XBus.35","XBus.34","XBus.33","XBus.32","XBus.31","XBus.30"];	-- pads
XBusMiddle: LIST OF REF = LIST[
LIST["XBus.10",	NIL, "XBus.11",	NIL, "XBus.12",	NIL, "XBus.13",	NIL],			-- pads
LIST["XBus.14",	NIL, "XBus.15",	NIL, "XBus.16",	NIL, "XBus.17",	NIL],			-- pads
LIST["XBus.20",	NIL, "XBus.21",	NIL, "XBus.22",	NIL, "XBus.23",	NIL],			-- pads
LIST["XBus.24",	NIL, "XBus.25",	NIL, "XBus.26",	NIL, "XBus.27",	NIL ] ];		-- pads

CPXBusXsformBot: LIST OF REF = IFUPW.LISTn
[NIL, NIL, NIL, NIL, NIL, NIL, GND, VDD, XBusMiddle];

Bottom of Data Column	**********************************************


Ê“��˜�šœ™Jšœ<™<Jšœ+™+Icode™&—J™�šÏk	œ˜
Jšœ˜Jšœ
˜
Jšœ˜Jšœ˜Jšœ˜—J˜�šœœœ˜!Jšœœ˜&Jšœ	˜Jš˜J˜�Jšœœœœ˜Jšœœœœ˜Jšœœ˜J˜�Jšœœ
œ˜-J˜�Jšœœ!˜,J˜�šœ	œ	œœœœ˜6Jšœ(˜(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šœ!œœ˜,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˜�š	œœœœœ˜)Jšœ˜Jšœ˜Jšœ˜Jšœœœœ˜#J˜�—J˜�š
Ïn
œœ	œ	œœ˜@šœœ˜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šœ˜Jšœ%˜%Jšœœ˜Jšœ	œ˜&Jšœœ7˜AJšœœ
˜Jšœœ
˜Jšœœœ ˜=Jšœ˜——J˜�š
žœœ	œ	œœ˜>šœœ˜Jšœ˜Jšœ$˜$Jšœœœ ˜=Jšœ	œ,˜9Jšœœ
œ˜"Jšœœ
˜Jšœœ7˜AJšœ˜——J˜�š
ž	œœ	œ	œœ˜?šœœ˜Jšœ˜Jšœ%˜%Jšœœ˜Jšœ	œ˜Jšœœ7˜AJšœœ
˜Jšœœ
˜Jšœœ7˜AJšœ˜——J˜�š
ž	œœ	œ	œœ˜?šœœ˜Jšœ˜Jšœ%˜%Jšœœ˜Jšœ	œ˜Jšœœ7˜AJšœœ
˜Jšœœ
˜Jšœœœ ˜=Jšœ˜——J˜�š
žœœ	œ	œœ˜=šœœ˜Jšœ˜Jšœ#˜#Jšœœœ ˜=Jšœ	œ<˜IJšœœ
œœ˜'Jšœœ
˜Jšœœ7˜AJšœ˜——J˜�š
ž	œœ	œ	œœ˜?šœœ˜Jšœ˜Jšœ%˜%Jšœœ˜Jšœ	œ˜Jšœœ7˜AJšœœ
˜Jšœœ
˜Jšœœ7˜AJšœ˜——J˜�š
ž	œœ	œ	œœ˜?šœœ˜Jšœ˜Jšœ%˜%Jšœœ˜Jšœœ7˜AJšœ	œ˜Jšœœ
˜Jšœœ
˜Jšœœœ ˜=Jšœ˜——J˜�šÏbE™EJ˜�—šœ
œœ™JšœQÏc™XJšœQ 	™ZJšœR 	™[—šœœ™JšœS ™Z—š	œœœœœ™Jšœœ
œ
œ
œ ™OJšœœ
œ
œ
œ ™OJšœœ
œ
œ
œ ™OJšœœ
œ
œ
œ ™Q—J˜�š	œœœœœ˜+Jšœ	˜	J˜�—š
žœœ	œ	œœ˜Bšœœ˜Jšœ˜Jšœ(˜(Jšœ	œ
˜Jšœ
˜
Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœœ˜——J˜�š	œœœœœ˜+Jšœ	˜	—J™�š	œœœœœ™*Jšœœœœœœœœœ™5—J™�J˜�J˜�JšŸD™DJ˜�š
ž
œœœœœ˜FJšœœ˜(Jšœ
œ˜*Jšœœœœœœœ˜)Jšœ8˜8—J˜�šžœœœ˜5Jšœœœœ˜šœœ
œœœ
˜0Jš	œœœœœ˜šœœ
œœœ	˜.Jšœœœ˜$Jšœ
œœœœœ˜KJšœœ5œ˜I—Jšœœœ˜#J˜�——šž	œœœœ
˜?š
žœœœœœ
˜@Jšœœ˜-Jšœœœœœœ˜0Jšœœ(˜3—Jšœœ˜Jšœœ˜š	œœœ
œ	˜.Jšœ˜šœ˜
Jšœ˜JšœK˜O—Jšœœ˜J˜�——š
žœœœœœ
˜DJšœœœœ˜ Jšœ!˜!Jšœœ˜—J˜�Jšœœ˜)J˜�šœ
œœ	œœœ˜?Jšœ˜Jšœ
˜
Jšœ	˜	Jšœ
˜
Jšœ	˜	Jšœ
˜
Jšœ
˜
Jšœ˜Jšœ
˜
Jšœ
˜
Jšœ˜—J˜�šœ&˜&Jšœœ8˜>—J˜�Jšœ:˜:˜�J˜�J˜�—J˜�Jšœ˜—J™�J™�—�…—����!Þ��5��