-- RouteChipmonkPlot.mesa -- cell subroutines to run within Chipmonk -- last changed by E. McCreight, September 21, 1982 10:25 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; itemCount: INTEGER ← 0; itemList: 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; 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]; 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