--routeUtilities.mesa DIRECTORY ZoneAllocDefs, RouteDefs, IODefs; RouteUtilities:PROGRAM IMPORTS ZoneAllocDefs, IODefs EXPORTS RouteDefs=BEGIN OPEN RouteDefs; Error:SIGNAL=CODE; channels:PUBLIC RectangleListPtr←NIL; problem:PUBLIC Problem←[cells:NIL,chipSize:[0,0],wirelist:NIL]; example:PUBLIC INTEGER←1; chipmonk,plot,print:PUBLIC BOOLEAN; inters:PUBLIC RectangleListPtr←NIL; topology:PUBLIC TopologyListPtr←NIL; paths:PUBLIC PathwayListPtr←NIL; layout:PUBLIC SiliconListPtr←NIL; rectangles:PUBLIC RectangleListPtr←NIL; EnumerateChannels:PUBLIC PROCEDURE[c:PROCEDURE[RectanglePtr]]= {FOR l:RectangleListPtr←channels,l.t UNTIL l=NIL DO c[l.h]; ENDLOOP}; EnumerateInters:PUBLIC PROCEDURE[c:PROCEDURE[RectanglePtr]]= {FOR l:RectangleListPtr←inters,l.t UNTIL l=NIL DO c[l.h]; ENDLOOP}; EnumerateRectangles:PUBLIC PROCEDURE[c:PROCEDURE[RectanglePtr]]= {FOR l:RectangleListPtr←rectangles,l.t UNTIL l=NIL DO c[l.h]; ENDLOOP}; EnumerateCells:PUBLIC PROCEDURE[call:PROCEDURE[CellPtr]]= {FOR l:CellListPtr←problem.cells,l.t UNTIL l=NIL DO call[l.h]; ENDLOOP}; EnumerateAllSignals:PUBLIC PROCEDURE[call:PROCEDURE[CellPtr,SignalPtr]]=BEGIN FOR l:CellListPtr←problem.cells,l.t UNTIL l=NIL DO FOR l2:SignalListPtr←l.h.signals,l2.t UNTIL l2=NIL DO call[l.h,l2.h]; ENDLOOP; ENDLOOP; END; EnumerateSignals:PUBLIC PROCEDURE[c:CellPtr,x:PROCEDURE[CellPtr,SignalPtr]]= {FOR l:SignalListPtr←c.signals,l.t UNTIL l=NIL DO x[c,l.h]; ENDLOOP}; EnumerateConns:PUBLIC PROCEDURE[r:RectanglePtr, c:PROCEDURE[RectanglePtr,ConnPtr]]= {FOR l:ConnListPtr←r.conns, l.t UNTIL l=NIL DO c[r,l.h]; ENDLOOP}; EnumerateEvents:PUBLIC PROCEDURE[r:RectanglePtr, c:PROCEDURE[RectanglePtr,EventPtr]]= {FOR l:EventListPtr←r.events, l.t UNTIL l=NIL DO c[r,l.h]; ENDLOOP}; EnumerateRuns:PUBLIC PROCEDURE[r:RectanglePtr, c:PROCEDURE[RectanglePtr,RunPtr]]= {FOR l:RunListPtr←r.runs,l.t UNTIL l=NIL DO c[r,l.h]; ENDLOOP}; EnumerateAllRuns:PUBLIC PROCEDURE[c:PROCEDURE[RectanglePtr,RunPtr]]=BEGIN temp:PROCEDURE[r:RectanglePtr]={EnumerateRuns[r,c]}; EnumerateChannels[temp]; END; EnumerateAllConns:PUBLIC PROCEDURE[call:PROCEDURE[RectanglePtr,ConnPtr]]=BEGIN Cm1:PROCEDURE[rect:RectanglePtr]={EnumerateConns[rect,call]}; EnumerateChannels[Cm1]; END; EnumerateSilicon:PUBLIC PROCEDURE[call:PROCEDURE[SiliconPtr]]=BEGIN FOR l:SiliconListPtr←layout,l.t UNTIL l=NIL DO IF l.h.pos#outOfSight THEN call[l.h]; ENDLOOP; END; Return:PUBLIC PROCEDURE={ShowChar[' ]}; ShowString:PUBLIC PROCEDURE[s:STRING]=BEGIN IF ~chipmonk THEN IODefs.WriteString[s]; END; ShowChar:PUBLIC PROCEDURE[c:CHARACTER]=BEGIN IF ~chipmonk THEN IODefs.WriteChar[c]; END; ShowLabel:PUBLIC PROCEDURE[s:STRING]=BEGIN Return[]; Return[]; ShowString[s]; Return[]; END; ShowCircuit:PUBLIC PROCEDURE[c:Circuit] RETURNS[CHARACTER]=BEGIN s:INTEGER=c-1; RETURN[SELECT c FROM 0=>'0, IN [1..26)=>'A + s, ENDCASE=>'2]; END; ShowDecimal:PUBLIC PROCEDURE[i:INTEGER,s:STRING←NIL]=BEGIN IF chipmonk THEN RETURN; IF s#NIL THEN IODefs.WriteString[s]; IODefs.WriteDecimal[i]; END; SameString:PUBLIC PROCEDURE[a,b:STRING] RETURNS[BOOLEAN]=BEGIN IF a.length#b.length THEN RETURN[FALSE]; FOR i:CARDINAL IN [0..a.length) DO IF a[i]#b[i] THEN RETURN[FALSE]; ENDLOOP; RETURN[TRUE]; END; Clear:PUBLIC PROCEDURE[s:STRING]=BEGIN FOR i:CARDINAL IN [0..s.length←s.maxlength) DO s[i]←' ; ENDLOOP; END; ShowPoint:PUBLIC PROCEDURE[s:STRING,x,y:INTEGER]=BEGIN OPEN IODefs; IF chipmonk THEN RETURN; WriteString[s]; WriteChar['[]; WriteDecimal[x]; WriteString[" , "]; WriteDecimal[y]; WriteChar[']]; END; ShowWire:PUBLIC PROCEDURE[s:SiliconPtr]=BEGIN ShowString[SELECT s.level FROM red=>" red ", blue=>" blue", ENDCASE=>" both"]; ShowPoint[" loc ",s.pos.x,s.pos.y]; ShowPoint[" ",s.pos2.x,s.pos2.y]; END; WritePoint:PUBLIC PROCEDURE[x,y:INTEGER]=BEGIN OPEN IODefs; IF chipmonk THEN RETURN; WriteChar['[]; WriteDecimal[x]; WriteString[" , "]; WriteDecimal[y]; WriteChar[']]; END; MakeType:PUBLIC PROCEDURE[n,e,s,w:BOOLEAN] RETURNS[InterType]=BEGIN RETURN[(IF n THEN 1 ELSE 0)+(IF e THEN 4 ELSE 0) +(IF s THEN 2 ELSE 0)+(IF w THEN 8 ELSE 0)]; END; -- ALLOCATIONS ListEntry:TYPE=RECORD[a:LONG POINTER,b:LONG POINTER TO ListEntry]; zone:UNCOUNTED ZONE; ReturnStorage:PUBLIC PROCEDURE= {zone←ZoneAllocDefs.DestroyAnXMZone[zone]}; InitStorage:PUBLIC PROCEDURE= {zone←ZoneAllocDefs.GetAnXMZone[]}; cntList:INTEGER←4000; AllocateList:PUBLIC PROCEDURE RETURNS[LONG POINTER]=BEGIN x:LONG POINTER TO ListEntry←zone.NEW[ListEntry]; IF (cntList←cntList-1)<0 THEN Error; x↑←[NIL,NIL]; RETURN[x]; END; FreeList:PUBLIC PROCEDURE[y:LONG POINTER]= {x:LONG POINTER TO ListEntry←y; zone.FREE[@x]; cntEvent←cntEvent+1}; cntEvent:INTEGER←500; AllocateEvent:PUBLIC PROCEDURE RETURNS[x:EventPtr]= {x←zone.NEW[Event←[]]; IF (cntEvent←cntEvent-1)<0 THEN Error}; FreeEvent:PUBLIC PROCEDURE[x:EventPtr]= {zone.FREE[@x]; cntEvent←cntEvent+1}; cntNet:INTEGER←600; AllocateNet:PUBLIC PROCEDURE RETURNS[x:NetPtr]= {x←zone.NEW[Net←[]]; IF (cntNet←cntNet-1)<0 THEN Error}; FreeNet:PUBLIC PROCEDURE[x:NetPtr]= {zone.FREE[@x]; cntNet←cntNet+1}; cntPathway:INTEGER←300; AllocatePathway:PUBLIC PROCEDURE RETURNS[x:PathwayPtr]= {x←zone.NEW[Pathway←[]]; IF (cntPathway←cntPathway-1)<0 THEN Error}; FreePathway:PUBLIC PROCEDURE[x:PathwayPtr]= {zone.FREE[@x]; cntPathway←cntPathway+1}; cntJunction:INTEGER←300; AllocateJunction:PUBLIC PROCEDURE RETURNS[x:JunctionPtr]= {x←zone.NEW[Junction←[]]; IF (cntJunction←cntJunction-1)<0 THEN Error}; FreeJunction:PUBLIC PROCEDURE[x:JunctionPtr]= {zone.FREE[@x]; cntJunction←cntJunction+1}; cntCell:INTEGER←125; AllocateCell:PUBLIC PROCEDURE RETURNS[x:CellPtr]= {x←zone.NEW[Cell←[]]; IF (cntCell←cntCell-1)<0 THEN Error}; FreeCell:PUBLIC PROCEDURE[x:CellPtr]= {zone.FREE[@x]; cntCell←cntCell+1}; cntSignal:INTEGER←1000; AllocateSignal:PUBLIC PROCEDURE RETURNS[x:SignalPtr]= {x←zone.NEW[Signal←[]]; IF (cntSignal←cntSignal-1)<0 THEN Error}; FreeSignal:PUBLIC PROCEDURE[x:SignalPtr]= {zone.FREE[@x]; cntSignal←cntSignal+1}; cntSilicon:INTEGER←4000; AllocateSilicon:PUBLIC PROCEDURE RETURNS[x:SiliconPtr]= {x←zone.NEW[Silicon←[]]; IF (cntSilicon←cntSilicon-1)<0 THEN Error}; FreeSilicon:PUBLIC PROCEDURE[x:SiliconPtr]= {zone.FREE[@x]; cntSilicon←cntSilicon+1}; cntPath:INTEGER←1000; AllocatePath:PUBLIC PROCEDURE RETURNS[x:PathPtr]= {x←zone.NEW[Path←[]]; IF (cntPath←cntPath-1)<0 THEN Error}; FreePath:PUBLIC PROCEDURE[x:PathPtr]= {zone.FREE[@x]; cntPath←cntPath+1}; cntRectangle:INTEGER←400; AllocateRectangle:PUBLIC PROCEDURE RETURNS[x:RectanglePtr]= {x←zone.NEW[Rectangle←[]]; IF (cntRectangle←cntRectangle-1)<0 THEN Error}; FreeRectangle:PUBLIC PROCEDURE[x:RectanglePtr]= {zone.FREE[@x]; cntRectangle←cntRectangle+1}; cntPlace:INTEGER←400; AllocatePlace:PUBLIC PROCEDURE RETURNS[x:PlacePtr]= {x←zone.NEW[Place←[]]; IF (cntPlace←cntPlace-1)<0 THEN Error}; FreePlace:PUBLIC PROCEDURE[x:PlacePtr]= {zone.FREE[@x]; cntPlace←cntPlace+1}; cntGrid:INTEGER←300; AllocateGrid:PUBLIC PROCEDURE RETURNS[x:GridPtr]= {x←zone.NEW[Grid←[]]; IF (cntGrid←cntGrid-1)<0 THEN Error}; FreeGrid:PUBLIC PROCEDURE[x:GridPtr]= {zone.FREE[@x]; cntGrid←cntGrid+1}; cntTopology:INTEGER←500; AllocateTopology:PUBLIC PROCEDURE RETURNS[x:TopologyPtr]= {x←zone.NEW[Topology←[]]; IF (cntTopology←cntTopology-1)<0 THEN Error}; FreeTopology:PUBLIC PROCEDURE[x:TopologyPtr]= {zone.FREE[@x]; cntTopology←cntTopology+1}; cntConn:INTEGER←500; AllocateConn:PUBLIC PROCEDURE RETURNS[x:ConnPtr]= {x←zone.NEW[Conn←[]]; IF (cntConn←cntConn-1)<0 THEN Error}; FreeConn:PUBLIC PROCEDURE[x:ConnPtr]= {zone.FREE[@x]; cntConn←cntConn+1}; cntRun:INTEGER←500; AllocateRun:PUBLIC PROCEDURE RETURNS[x:RunPtr]= {x←zone.NEW[Run←[]]; IF (cntRun←cntRun-1)<0 THEN Error}; FreeRun:PUBLIC PROCEDURE[x:RunPtr]= {zone.FREE[@x]; cntRun←cntRun+1}; cntIWire:INTEGER←1000; AllocateIWire:PUBLIC PROCEDURE RETURNS[x:IWirePtr]= {x←zone.NEW[IWire←[]]; IF (cntIWire←cntIWire-1)<0 THEN Error}; FreeIWire:PUBLIC PROCEDURE[x:IWirePtr]= {zone.FREE[@x]; cntIWire←cntIWire+1}; END. AllocateList:PUBLIC PROCEDURE RETURNS[LONG POINTER]=BEGIN ans:LONG POINTER TO ListEntry←freeList; freeList←ans.b; ans↑←[NIL,NIL]; RETURN[ans]; END; FreeList:PUBLIC PROCEDURE[x:POINTER]=BEGIN ans:POINTER TO ListEntry=x; ans↑←[NIL,freeList]; freeList←ans; END;