-- RouteChipmonkPlot.mesa
-- cell subroutines to run within Chipmonk
-- last changed by W Crowther, May 10, 1983 9:43 AM
-- written by E. McCreight, September 16, 1982 1:46 PM
DIRECTORY
ChipUserInt,
ppdddefs,
ppddefs,
ppdefs,
RouteDefs,
StringDefs;
RouteChipmonkPlot: PROGRAM
IMPORTS ChipUserInt, ppdddefs, ppddefs,
ppdefs, RouteDefs, StringDefs
EXPORTS RouteDefs =
BEGIN
GetChipmonkString: PUBLIC PROCEDURE[
result, prompt1: STRING,
prompt2, prompt3: STRING ← NIL] =
BEGIN
s: STRING ←
ChipUserInt.RequestString[prompt1, prompt2, prompt3
! ChipUserInt.Punt => GOTO Punted];
result.length ← 0;
StringDefs.AppendString[to: result, from: s];
ppdefs.FreeString[s];
EXITS
Punted => ERROR RouteDefs.Interrupt;
END; -- of GetChipmonkString
PlotCell: PUBLIC PROCEDURE [cell: RouteDefs.CellPtr] =
BEGIN OPEN ppdefs;
cellOb: obPtr ← NIL;
ob1: obPtr ← NIL;
itemCount: INTEGER ← 0;
itemList: listPtr ← NIL;
item1: listPtr ←NIL;
sx: locNum = Lambda*cell.sizeL.x;
sy: locNum = Lambda*cell.sizeL.y;
FOR s: RouteDefs.SignalListPtr ← cell.signals, s.t
WHILE s#NIL DO
signal: RouteDefs.SignalPtr = s.h;
ob: obPtr =
SELECT signal.level FROM
blue => ppdddefs.makeWire[len: 3*Lambda,
wid: 3*Lambda, l: met],
red => ppdddefs.makeWire[len: 2*Lambda,
wid: 2*Lambda, l: pol],
ENDCASE --both-- => ppdddefs.makePolycon[0];
item: listPtr = ppdddefs.makeList[p: ob,
x: (SELECT signal.side FROM
n, s => Lambda*signal.offset,
e => sx-ob.size[0],
ENDCASE --w, x-- => 0),
y: (SELECT signal.side FROM
e, w => sy-Lambda*signal.offset-ob.size[1],
n => 0,
ENDCASE --s, x-- => sy-ob.size[1]),
o: 0, refl: 0];
IF signal.name#NIL AND signal.name.length>0 THEN
BEGIN
tp: LONG POINTER TO text ppdefs.prop =
ppddefs.alocTextProp[];
tp.s ← newString[signal.name];
ppdddefs.putProp[item, tp];
END;
itemList ← ppddefs.insertList[itemList, item];
itemCount ← itemCount+1;
ENDLOOP;
ob1 ← ppdddefs.makeWire[len: sy, wid: 1*Lambda, l: pol];
item1 ← ppdddefs.makeList[p: ob1, x: 0, y: 0, o: 0, refl: 0];
itemList ← ppddefs.insertList[itemList, item1];
item1 ← ppdddefs.makeList[p: ob1, x: sx-1, y: 0, o: 0, refl: 0];
itemList ← ppddefs.insertList[itemList, item1];
ob1 ← ppdddefs.makeWire[len: sx, wid: 1*Lambda, l: pol];
item1 ← ppdddefs.makeList[p: ob1, x: 0, y: 0, o: 2, refl: 0];
itemList ← ppddefs.insertList[itemList, item1];
item1 ← ppdddefs.makeList[p: ob1, x: 0, y: sy-1, o: 2, refl: 0];
itemList ← ppddefs.insertList[itemList, item1];
itemCount ← itemCount+4;
cellOb ← ppdddefs.makeCell[sx: sx, sy: sy, cnt: itemCount, ptr: itemList];
masterList ← ppddefs.insertList[masterList,
ppdddefs.makeList[p: cellOb, x: Lambda*cell.pos.x,
y: -Lambda*cell.pos.y-sy,
o: 0, refl: 0]];
ppddefs.dChange ← TRUE;
END; -- of PlotCell
routeList: ppdefs.listPtr ← NIL;
StartPlot: PUBLIC PROCEDURE = {routeList ← NIL};
EndPlot: PUBLIC PROCEDURE =
BEGIN OPEN ppdefs;
mix, miy, max, may: locNum;
count: INTEGER ← 0;
lp: LONG POINTER TO list;
cellOb: obPtr;
[mix, miy, max, may] ← minmax[routeList];
mix ← 0;
miy ← -Lambda*RouteDefs.problem.chipSize.y;
max ← Lambda*RouteDefs.problem.chipSize.x;
may ← 0;
FOR list: listPtr ← routeList, list.nxt WHILE list#NIL DO
list.lx ← list.lx-mix;
list.ly ← list.ly-miy;
count ← count+1;
ENDLOOP;
cellOb ← ppdddefs.makeCell[sx: max-mix, sy: may-miy,
cnt: count, ptr: routeList];
masterList ← ppddefs.insertList[masterList,
lp←ppdddefs.makeList[p: cellOb, x: mix, y: miy,
o: 0, refl: 0]];
ppddefs.dChange ← TRUE;
routeList ← NIL;
END;
PlotBlueWire: PUBLIC PROCEDURE[hor: BOOLEAN,
x,y,l: RouteDefs.Lambda] =
BEGIN OPEN ppdefs;
item: listPtr;
wire: obPtr;
IF l<=0 THEN ERROR;
wire ← ppdddefs.makeWire[len: Lambda*l, wid: 3*Lambda, l: met];
item ← ppdddefs.makeList[p: wire, x: Lambda*x,
y: -Lambda*y-wire.size[IF hor THEN 0 ELSE 1],
o: (IF hor THEN 2 ELSE 0), refl: 0];
routeList ← ppddefs.insertList[routeList, item];
END; -- of PlotBlueWire
PlotRedWire: PUBLIC PROCEDURE[hor: BOOLEAN,
x,y,l: RouteDefs.Lambda] =
BEGIN OPEN ppdefs;
item: listPtr;
wire: obPtr;
IF l<=0 THEN ERROR;
wire ← ppdddefs.makeWire[len: Lambda*l, wid: 2*Lambda, l: pol];
item ← ppdddefs.makeList[p: wire, x: Lambda*x,
y: -Lambda*y-wire.size[IF hor THEN 0 ELSE 1],
o: (IF hor THEN 2 ELSE 0), refl: 0];
routeList ← ppddefs.insertList[routeList, item];
END; -- of PlotRedWire
PlotBlueRedContact: PUBLIC PROCEDURE[x,y: RouteDefs.Lambda] =
BEGIN OPEN ppdefs;
item: listPtr;
cont: obPtr = ppdddefs.makePolycon[0];
item ← ppdddefs.makeList[p: cont, x: Lambda*x,
y: -Lambda*y-cont.size[1], o: 0, refl: 0];
routeList ← ppddefs.insertList[routeList, item];
END; -- of PlotBlueRedContact
Interrupt: PUBLIC ERROR = CODE;
END. -- of RouteChipmonkPlot