-- 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