<> <> <> <<>> DIRECTORY CD, CDFrame, CDOrient, Commander, IFUAsm, IFUPW, IO, Rope; IFUAsmComplete: CEDAR PROGRAM IMPORTS CDFrame, CDOrient, IFUAsm, IFUPW, IO, Rope EXPORTS IFUAsm = BEGIN OPEN IFUAsm; Pad: PROC[ design: CD.Design, side: IFUPW.Side, index: INT, pad: IFUPW.Pad144Type, data1: Rope.ROPE _ NIL, data2: Rope.ROPE _ NIL, enable: Rope.ROPE _ NIL] RETURNS[frame: IFUPW.Frame] = { test: INT _ SELECT side FROM right=>34-index, top=>36-index ENDCASE=>index; Error: BOOL _ SELECT test FROM 0 => pad#vddcnr AND (side=bottom OR side=top), 17 => pad#padgnd, 18 => pad#padvdd, 36 => pad#gndcnr AND (side=bottom OR side=top), ENDCASE => FALSE; IF Error THEN ERROR; RETURN[IFUPW.Pad144[design, side, index, pad, data1, data2, enable]]}; PadLtProc: CDFrame.ExpandProc = { ii: INT _ 34; new _ CDFrame.NewFrame[ii+1+1, y, frame.shell.name]; FOR jj: INT DECREASING IN [0..8) DO data: ROPE _ IO.PutFR["IPCmnd3A.%g", IO.int[jj] ]; new[ii+1] _ Pad[design, left, ii, out, data]; ii _ ii-1; ENDLOOP; FOR jj: INT DECREASING IN [0..4) DO data: ROPE _ IO.PutFR["IPFaultB.%g", IO.int[jj] ]; new[ii+1] _ Pad[design, left, ii, in, data]; ii _ ii-1; ENDLOOP; new[ii+1] _ Pad[design, left, ii, in, "IPRejectB"]; ii _ ii-1; new[ii+1] _ Pad[design, left, ii, empty]; ii _ ii-1; new[ii+1] _ Pad[design, left, ii, empty]; ii _ ii-1; new[ii+1] _ Pad[design, left, ii, empty]; ii _ ii-1; new[ii+1] _ Pad[design, left, ii, padvdd, "VDD"]; ii _ ii-1; new[ii+1] _ CDFrame.Glue[t: conn, b: ext]; new[ii+0] _ Pad[design, left, ii, padgnd, "GND"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, empty]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, in, "Reset"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, in, "Reschedule"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, empty]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, clock, "Clock"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, in, "PhaseClockSel"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, clock, "ExplicitPhA"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, clock, "ExplicitPhB"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, empty]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, in, "DHoldAB"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, in, "DShiftAB"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, in, "DExecuteAB"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, in, "DNSelectAB"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, in, "DDataInAB"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, out, NIL, "DDataOutAB", "VDD"]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, empty]; ii _ ii-1; new[ii+0] _ Pad[design, left, ii, empty]; IF ii#0 THEN ERROR }; PadLt: PUBLIC IFUPW.Frame _ CDFrame.NewExpandFrame["IFUAsmPadLt", PadLtProc]; PadRtProc: CDFrame.ExpandProc = { ii: INT _ 34; new _ CDFrame.NewFrame[ii+1+1, y, frame.shell.name]; FOR jj: INT DECREASING IN [0..8) DO data: ROPE _ IO.PutFR["DpCmnd3A.%g", IO.int[jj] ]; new[ii+1] _ Pad[design, right, ii, out, data]; ii _ ii-1; ENDLOOP; FOR jj: INT DECREASING IN [0..4) DO data: ROPE _ IO.PutFR["DpFaultB.%g", IO.int[jj] ]; new[ii+1] _ Pad[design, right, ii, in, data]; ii _ ii-1; ENDLOOP; new[ii+1] _ Pad[design, right, ii, in, "DpRejectB"]; ii _ ii-1; new[ii+1] _ Pad[design, right, ii, empty]; ii _ ii-1; new[ii+1] _ Pad[design, right, ii, empty]; ii _ ii-1; new[ii+1] _ Pad[design, right, ii, empty]; ii _ ii-1; new[ii+1] _ Pad[design, right, ii, empty]; ii _ ii-1; new[ii+1] _ Pad[design, right, ii, padgnd, "GND"]; ii _ ii-1; new[ii+1] _ CDFrame.Glue[t: conn, b: ext]; new[ii] _ Pad[design, right, ii, padvdd, "VDD"]; ii _ ii-1; FOR jj: INT DECREASING IN [0..5) DO data: ROPE _ IO.PutFR["EuAluOp2AB.%g", IO.int[jj] ]; new[ii] _ Pad[design, right, ii, out, NIL, data, "VDD"]; ii _ ii-1; ENDLOOP; FOR jj: INT DECREASING IN [0..4) DO data: ROPE _ IO.PutFR["EuCondSel2AB.%g", IO.int[jj] ]; new[ii] _ Pad[design, right, ii, out, NIL, data, "VDD"]; ii _ ii-1; ENDLOOP; new[ii] _ Pad[design, right, ii, out, NIL, "EuSt3AisCBus2BA", "VDD"]; ii _ ii-1; new[ii] _ Pad[design, right, ii, out, NIL, "EuRes3AisCBus2BA", "VDD"]; ii _ ii-1; new[ii] _ Pad[design, right, ii, out, NIL, "EuCondition2BA", "VDD"]; ii _ ii-1; new[ii] _ Pad[design, right, ii, out, NIL, "EuRes3BisPBus3AB", "VDD"]; ii _ ii-1; new[ii] _ Pad[design, right, ii, out, NIL, "EuWriteToPBus3AB", "VDD"]; ii _ ii-1; new[ii] _ Pad[design, right, ii, out, NIL, "EuWriteField3BA", "VDD"]; ii _ ii-1; new[ii] _ Pad[design, right, ii, in, "AuConnected"]; IF ii#0 THEN ERROR }; PadRt: PUBLIC IFUPW.Frame _ CDFrame.NewExpandFrame["IFUAsmPadRt", PadRtProc]; PadTopProc: CDFrame.ExpandProc = { new _ CDFrame.NewFrame[3, x, frame.shell.name]; new[0] _ Pad[design, top, 0, gndcnr, "GND"]; new[1] _ CDFrame.NewFrame[36, x, frame.shell.name.Cat["Mid"]]; new[1][0] _ Pad[design, top, 1, empty]; FOR i: INT IN [0..16) DO data: ROPE _ IO.PutFR["IPBus.%02b", IO.int[i] ]; new[1][i+1] _ Pad[design, top, i+2, tri, data, data, "PhA"]; ENDLOOP; new[1][17] _ Pad[design, top, 18, padvdd, "VDD"]; new[1][17+1] _ CDFrame.Glue[l: conn, r: ext]; new[1][18+1] _ Pad[design, top, 19, padgnd, "GND"]; FOR i: INT IN [0..16) DO data: ROPE _ IO.PutFR["IPBus.%02b", IO.int[i+16] ]; new[1][i+19+1] _ Pad[design, top, i+20, tri, data, data, "PhA"]; ENDLOOP; new[2] _ Pad[design, top, 36, vddcnr, "VDD"] }; PadTop: PUBLIC IFUPW.Frame _ CDFrame.NewExpandFrame["IFUAsmPadTop", PadTopProc]; PadBotProc: CDFrame.ExpandProc = { new _ CDFrame.NewFrame[3, x, frame.shell.name]; new[0] _ Pad[design, bottom, 0, vddcnr, "VDD"]; new[1] _ CDFrame.NewFrame[36, x, frame.shell.name.Cat["Mid"]]; FOR i: INT IN [0..16) DO data: ROPE _ IO.PutFR["XBus.%02b", IO.int[i] ]; new[1][i] _ Pad[design, bottom, i+1, tri, data, data, "KBusOutEnA"]; ENDLOOP; new[1][17-1] _ Pad[design, bottom, 17, padgnd, "GND"]; new[1][17] _ CDFrame.Glue[l: conn, r: ext]; new[1][18] _ Pad[design, bottom, 18, padvdd, "VDD"]; FOR i: INT IN [0..16) DO data: ROPE _ IO.PutFR["XBus.%02b", IO.int[i+16] ]; new[1][i+19] _ Pad[design, bottom, i+19, tri, data, data, "KBusOutEnA"]; ENDLOOP; new[1][35] _ Pad[design, bottom, 35, empty]; new[2] _ Pad[design, bottom, 36, gndcnr, "GND"] }; PadBot: PUBLIC IFUPW.Frame _ CDFrame.NewExpandFrame["IFUAsmPadBot", PadBotProc]; PadExt: PROC[side1, side2: CDFrame.Side] RETURNS[frame: CDFrame.Frame] = { frame _ IFUPW.NFS[CDFrame.ID["PadExt"], x, LIST[ CDFrame.NewObjectFrame[IFUPW.RawPad[ext]], CDFrame.Glue[r: ext, l: conn] ], CDOrient.ComposeOrient[ SELECT side1 FROM top => CDOrient.rotate90, bottom => CDOrient.rotate270X, left => CDOrient.mirrorX, right => CDOrient.original, ENDCASE => ERROR, SELECT side2 FROM top => CDOrient.original, bottom => CDOrient.mirrorY, left => CDOrient.original, right => CDOrient.mirrorX, ENDCASE => ERROR] ]; frame[1].shell.name _ "PadExtension"}; Core: PUBLIC IFUPW.Frame _ IFUPW.NFS["IFUAsmCore", x, LIST[ LeftColumn, CDFrame.Glue[name: "LtColumnRoute", l: conn, r: conn, tDir: vertical], CDFrame.Glue[ l: ext, r: conn, xlate: TRUE], DataColumn, CDFrame.Glue[ l: conn, r: ext, xlate: TRUE], CDFrame.Glue[name: "RtColumnRoute", l: conn, r: conn, tDir: vertical], RightColumn ] ]; PadCore: PUBLIC IFUPW.Frame _ IFUPW.NFS["IFUAsmPadCore", x, LIST[ PadLt, IFUPW.NFS["IFUAsmPadCoreMid", x, LIST[ CDFrame.Glue[name: "LtPadRoute", l: pwr, b: diff, r: conn, tDir: vertical], Core, CDFrame.Glue[name: "RtPadRoute", l: conn, b: diff, r: pwr, tDir: vertical] ] ], PadRt ] ]; Complete: PUBLIC IFUPW.Frame _ IFUPW.NFS["IFUAsmComplete", y, LIST[ PadTop, IFUPW.NFS["TopPadGlue", x, LIST[ PadExt[top, left], CDFrame.Glue[name: "TopPadRoute", t: pwr, b: conn, tDir: horizontal], PadExt[top, right] ] ], PadCore, IFUPW.NFS["BotPadGlue", x, LIST[ PadExt[bottom, left], CDFrame.Glue[name: "BotPadRoute", t: conn, b: pwr, tDir: horizontal], PadExt[bottom, right] ] ], PadBot ] ]; PadTopCT: Commander.CommandProc = { IFUPW.AssembleFrame[IFUAsm.RefDesign[], PadTop, cmd ] }; PadBotCT: Commander.CommandProc = { IFUPW.AssembleFrame[IFUAsm.RefDesign[], PadBot, cmd ] }; PadLtCT: Commander.CommandProc = { IFUPW.AssembleFrame[IFUAsm.RefDesign[], PadLt, cmd ] }; PadRtCT: Commander.CommandProc = { IFUPW.AssembleFrame[IFUAsm.RefDesign[], PadRt, cmd ] }; CoreCT: Commander.CommandProc = { IFUPW.AssembleFrame[IFUAsm.RefDesign[], Core, cmd ] }; PadCoreCT: Commander.CommandProc = { IFUPW.AssembleFrame[IFUAsm.RefDesign[], PadCore, cmd ] }; CompleteCT: Commander.CommandProc = { IFUPW.AssembleFrame[IFUAsm.RefDesign[], Complete, cmd ] }; PadTopCD: IFUPW.PWUserProc = {RETURN[IFUPW.FrameToObject[PadTop, design]]}; PadBotCD: IFUPW.PWUserProc = {RETURN[IFUPW.FrameToObject[PadBot, design]]}; PadLtCD: IFUPW.PWUserProc = {RETURN[IFUPW.FrameToObject[PadLt, design]]}; PadRtCD: IFUPW.PWUserProc = {RETURN[IFUPW.FrameToObject[PadRt, design]]}; CoreCD: IFUPW.PWUserProc = {RETURN[IFUPW.FrameToObject[Core, design]]}; PadCoreCD: IFUPW.PWUserProc = {RETURN[IFUPW.FrameToObject[PadCore, design]]}; CompleteCD: IFUPW.PWUserProc = {RETURN[IFUPW.FrameToObject[Complete, design]]}; <<>> <> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <> END.