--routedefs.mesa
DIRECTORY IODefs;
RouteDefs:DEFINITIONS = BEGIN
--ROUTEDEFS
Circuit:TYPE=INTEGER;
RunNo:TYPE=INTEGER;
bigRun:RunNo=10000;
EventNo:TYPE=INTEGER;
ChannelNo:TYPE=INTEGER;
InterNo:TYPE=INTEGER;
Lambda:TYPE=INTEGER;
bigLambda:Lambda=32000;
NetNo:TYPE=INTEGER;
JoinType:TYPE=INTEGER;
InterType:TYPE=INTEGER;
noOffset:INTEGER=1000;
CoordL:TYPE=RECORD[x,y:INTEGER←0]; --in lambda
CoordC:TYPE=RECORD[x,y:INTEGER←0]; --in events
nilG:Link=[];
outOfSight:CoordL=[-20,-20];
BoolPtr:TYPE=POINTER TO BOOLEAN;
ProcedureDescriptor:TYPE=RECORD[doit,printIt:PROCEDURE,enabler:BoolPtr];
Where:TYPE={top,bottom,left,right}←top;
What:TYPE={blue,red,both};
Level:TYPE={red,blue};
ConnKind:TYPE={none,left,right,tee,edge}←none;
Side:TYPE={n,s,e,w,x}←x;
Turn:TYPE={se,sw,ne,nw,hor,vert}; --relative to inter
RectKind:TYPE={none,cell,channel,inter,culDeSacR,culDeSacL,box,bend5,bend9,bend6,bend10,wallL,wallR};
Orient:TYPE={unknown,hor,vert,inter,bend};
Huggers:TYPE=RECORD[ch,n,s,e,w:Side←x,valid:BOOLEAN←FALSE];
Levelers:TYPE=RECORD[n,s,e,w:[0..6]←0];
Margins:TYPE=RECORD[n,s,e,w:[0..16)←3];
--LOOK HERE !!
Problem:TYPE=RECORD[cells:CellListPtr←NIL, chipSize:CoordL←[],
wirelist:NetListPtr←NIL];
Rectangle:TYPE=RECORD[
pos:CoordL, --Rectangle.CreateRectangle, Rectless.Compress
sizeL:CoordL, --Rectangle.CreateRectangle, Rectless.Compress
l:Link←[], --Rectless.CreateSecondaryLists
n,s,e,w:RectanglePtr←NIL, --Rectless.Compress
nw,sw,ne,se,en,wn,es,ws:Lambda←0,
nSource,sSource, --Rectangle.CreateRectangle
wSource,eSource:BOOLEAN←FALSE,--Rectangle.CreateRectangle
channelNo:ChannelNo←0, --Rectangle.CreateRectangle
sizeC:CoordC, --Rectless.ComputeSizeC
junction:JunctionPtr←NIL, --Rectless.CreateSecondaryLists
events:EventListPtr←NIL, --Rectangle.AddEvent, Rectless.Compress
orient:Orient←unknown, --Rectless.MarkNatureAndOrientAndWhere
nature:RectKind←none, --Rectless.MarkNatureAndOrientAndWhere
runs:RunListPtr←NIL, --Runs.AddRun
conns:ConnListPtr←NIL,
levelers:Levelers, --Rectless.*MakeLevelers*
margins:Margins,
used:INTEGER←0,
avail:INTEGER←0,
usedCircuit:INTEGER←0
];
Event:TYPE=RECORD[
index:INTEGER←-1, --Rectless.SetEventNumbers
circuit:Circuit←0, --Rectangle.AddEvent
where:Where, --Rectless.xxx
side:Side, --Rectangle.AddEvent
level:What←both,
offset:Lambda←noOffset, --Rectangle.AddEvent, Rectless.AdjustOffset
net:NetPtr←NIL, --Rectangle.AddEvent
opposite:EventPtr←NIL, --Rectless.SetEventNumbers
next,prev:EventPtr←NIL, --Rectless.SetnextAndPrevEvents
conn:ConnPtr←NIL --Conn.MakeEdgeConn
];
-- Source1 = Runs.MakeRun, Runs.FixUpJunctionWithInters, Crosses.SplitCon
Run:TYPE=RECORD[
circuit:Circuit←0, --Source1
run:RunNo←0, --Runs.AssignCulDeSac/TopDown/BottomUpRunNo
start,end:EventNo←0, --Source1
startOff,endOff:INTEGER←0, --Crosses.SetRunOffset
chan:RectanglePtr←NIL, --Source1
path:PathPtr←NIL, --Runs.MakeRun/FixUpJunctionWithInters
order:BOOLEAN←FALSE,
stU,stD,stL:BOOLEAN←FALSE, --Runs.MakeRun/FixUpJunctionWithInters,
endU,endD,endL:BOOLEAN←FALSE, --Runs.MakeRun/FixUpJunctionWithInters
startOffX,endOffX:Lambda←0,
startConn,endConn:ConnPtr←NIL --Conn.Make..Conn, Crosses.SplitCon
];
-- Crosses.SplitConn copies a whole conn, as well as changing fields
Conn:TYPE=RECORD[
circuit:Circuit←0, --Conn.Make..Conn
start,end:RunNo←0, --Conn.Make..Conn, Crosses.Split
event:EventNo←0, --Conn.Make..Conn
level:Level←red, --Conn.FixJogColor
startKind,endKind:ConnKind, --Crosses.InitConn, Crosses.Split
offset:INTEGER←noOffset, --Conn.Offset..
eventPtr:EventPtr←NIL, --Conn.Make..Conn
lambdaX:Lambda←-1,
startRun,endRun:RunPtr←NIL, --Conn.Make..Conn
closeS,closeE:BOOLEAN←FALSE --Conn.FixJogColor
];
Cell:TYPE=RECORD[sizeL,pos:CoordL←[], signals:SignalListPtr←NIL,
cellNo:INTEGER←0];
Signal:TYPE=RECORD[name:STRING←NIL,circuit:Circuit←0,side:Side←n,
level:What←both,offset:Lambda←0,net:NetPtr←NIL];
Net:TYPE=RECORD[number:Circuit←0,name:STRING←NIL,netNo:NetNo←0];
Link:TYPE=RECORD[channel:RectanglePtr←NIL,inter:RectanglePtr←NIL];
Topology:TYPE=RECORD[one,two:RectanglePtr←NIL,oneToTwo:Side←e];
Path:TYPE=RECORD[n,s,e,w:PathPtr←NIL,
channel:RectanglePtr←NIL, inter:RectanglePtr←NIL,
index:EventPtr←NIL, pathNo:INTEGER←0, started:BOOLEAN←FALSE,
circuit:Circuit←-1, wire:IWirePtr, huggers:Huggers←[]];
Pathway:TYPE=RECORD[circuit:Circuit←0,path:PathListPtr←NIL];
Silicon:TYPE=RECORD[pos,pos2:CoordL←[0,0],level:What←both,
solid:BOOLEAN←FALSE, circuit:Circuit←0];
Junction:TYPE=RECORD[iwires:IWireListPtr←NIL,ne,nw,se,sw:Bridge←[], bridgeNS,bridgeEW:RunNo←0];
IWire:TYPE=RECORD[type:InterType←0,ey,wy,nx,sx:RunNo←-1,
circuit:Circuit←-1,h:Huggers←[],be1,be2,bn1,bn2:BOOLEAN←FALSE,
path:PathPtr];
Bridge:TYPE=RECORD[x,y:RunNo←-1,hor:BOOLEAN←TRUE];
--place and grid internal to Paths, here only for allocation
Place:TYPE=RECORD[pos:CoordL←[0,0],score:Lambda←0,circuit:Circuit←0,
back,n,s,e,w:PlacePtr←NIL, perm:BOOLEAN←FALSE, done:BOOLEAN←FALSE,
un,us,ue,uw:RectanglePtr←NIL];
Grid:TYPE=RECORD[a,b:PlacePtr←NIL,above,below:Link←nilG,hor,done,hi,lo:BOOLEAN←FALSE];
RectanglePtr:TYPE=LONG POINTER TO Rectangle←NIL;
ConnPtr:TYPE=LONG POINTER TO Conn←NIL;
EventPtr:TYPE=LONG POINTER TO Event←NIL;
RunPtr:TYPE=LONG POINTER TO Run←NIL;
CellPtr:TYPE=LONG POINTER TO Cell←NIL;
SignalPtr:TYPE=LONG POINTER TO Signal←NIL;
NetPtr:TYPE=LONG POINTER TO Net←NIL;
TopologyPtr:TYPE=LONG POINTER TO Topology←NIL;
PathPtr:TYPE=LONG POINTER TO Path←NIL;
PathwayPtr:TYPE=LONG POINTER TO Pathway←NIL;
PlacePtr:TYPE=LONG POINTER TO Place←NIL;
GridPtr:TYPE=LONG POINTER TO Grid←NIL;
SiliconPtr:TYPE=LONG POINTER TO Silicon←NIL;
JunctionPtr:TYPE=LONG POINTER TO Junction←NIL;
IWirePtr:TYPE=LONG POINTER TO IWire←NIL;
RectangleList:TYPE=RECORD[h:RectanglePtr,t:RectangleListPtr];
ConnList:TYPE=RECORD[h:ConnPtr,t:ConnListPtr];
EventList:TYPE=RECORD[h:EventPtr,t:EventListPtr];
RunList:TYPE=RECORD[h:RunPtr,t:RunListPtr];
CellList:TYPE=RECORD[h:CellPtr,t:CellListPtr];
SignalList:TYPE=RECORD[h:SignalPtr,t:SignalListPtr];
NetList:TYPE=RECORD[h:NetPtr,t:NetListPtr];
TopologyList:TYPE=RECORD[h:TopologyPtr,t:TopologyListPtr];
PathList:TYPE=RECORD[h:PathPtr,t:PathListPtr];
PathwayList:TYPE=RECORD[h:PathwayPtr,t:PathwayListPtr];
PlaceList:TYPE=RECORD[h:PlacePtr,t:PlaceListPtr];
GridList:TYPE=RECORD[h:GridPtr,t:GridListPtr];
SiliconList:TYPE=RECORD[h:SiliconPtr,t:SiliconListPtr];
IWireList:TYPE=RECORD[h:IWirePtr,t:IWireListPtr];
RectangleListPtr:TYPE=LONG POINTER TO RectangleList;
ConnListPtr:TYPE=LONG POINTER TO ConnList;
EventListPtr:TYPE=LONG POINTER TO EventList;
RunListPtr:TYPE=LONG POINTER TO RunList;
CellListPtr:TYPE=LONG POINTER TO CellList;
SignalListPtr:TYPE=LONG POINTER TO SignalList;
NetListPtr:TYPE=LONG POINTER TO NetList;
TopologyListPtr:TYPE=LONG POINTER TO TopologyList;
PathListPtr:TYPE=LONG POINTER TO PathList;
PathwayListPtr:TYPE=LONG POINTER TO PathwayList;
PlaceListPtr:TYPE=LONG POINTER TO PlaceList;
GridListPtr:TYPE=LONG POINTER TO GridList;
SiliconListPtr:TYPE=LONG POINTER TO SiliconList;
IWireListPtr:TYPE=LONG POINTER TO IWireList;
CtlProc:TYPE=PROCEDURE RETURNS[INTEGER];
-- END OF TYPE DECLARATIONS
--Ctl Procs called by RouteControl
CreateCells:CtlProc;--RouteCells
CreateRectangles:CtlProc;--RouteRectangle
RectLess:CtlProc; --RouteRectLess
MakeLevelers:CtlProc; --RouteRectLess
CreateTopology:CtlProc;--RouteTopology
ChannelLevelRouting:CtlProc;--RoutePaths2
MakeHugs:CtlProc;--RouteHugs
RouteIntersections:CtlProc;--RouteInter
TheMainShowIsRouteRunsInChannels:CtlProc;--RouteRuns
InstallCrossChannelConnections:CtlProc;--RouteConn
InstallInternalContacts:CtlProc;--RouteCrosses
DoSilicon:CtlProc; --RouteSilicon
CheckLayout:CtlProc; --RouteChecker
--misc
ReducePath:PROCEDURE;--RoutePaths1
GetInput:PROCEDURE; --from RouteParse
--the following are all implemented in utilities
EnumerateChannels:PROCEDURE[PROCEDURE[RectanglePtr]];
EnumerateInters:PROCEDURE[PROCEDURE[RectanglePtr]];
EnumerateRectangles:PROCEDURE[PROCEDURE[RectanglePtr]];
EnumerateSignals:PROCEDURE[c:CellPtr,x:PROCEDURE[CellPtr,SignalPtr]];
EnumerateCells:PROCEDURE[PROCEDURE[CellPtr]];
EnumerateConns:PROCEDURE[RectanglePtr,PROCEDURE[RectanglePtr,ConnPtr]];
EnumerateEvents:PROCEDURE[RectanglePtr,PROCEDURE[RectanglePtr,EventPtr]];
EnumerateRuns:PROCEDURE[RectanglePtr,PROCEDURE[RectanglePtr,RunPtr]];
EnumerateAllSignals:PROCEDURE[PROCEDURE[CellPtr,SignalPtr]];
EnumerateAllRuns:PROCEDURE[c:PROCEDURE[RectanglePtr,RunPtr]];
EnumerateAllConns:PROCEDURE[call:PROCEDURE[RectanglePtr,ConnPtr]];
EnumerateSilicon:PROCEDURE[call:PROCEDURE[SiliconPtr]];
InitStorage,ReturnStorage:PROCEDURE;
AllocateList:PROCEDURE RETURNS[LONG POINTER];
AllocateRectangle:PROCEDURE RETURNS[RectanglePtr];
--AllocateChannel:PROCEDURE RETURNS[ChannelPtr];
AllocateEvent:PROCEDURE RETURNS[EventPtr];
AllocateRun:PROCEDURE RETURNS[RunPtr];
AllocateConn:PROCEDURE RETURNS[ConnPtr];
AllocateCell:PROCEDURE RETURNS[CellPtr];
AllocateSignal:PROCEDURE RETURNS[SignalPtr];
AllocateNet:PROCEDURE RETURNS[NetPtr];
AllocateTopology:PROCEDURE RETURNS[TopologyPtr];
AllocatePathway:PROCEDURE RETURNS[PathwayPtr];
AllocatePlace:PROCEDURE RETURNS[PlacePtr];
AllocatePath:PROCEDURE RETURNS[PathPtr];
AllocateGrid:PROCEDURE RETURNS[GridPtr];
AllocateSilicon:PROCEDURE RETURNS[SiliconPtr];
AllocateIWire:PROCEDURE RETURNS[IWirePtr];
AllocateJunction:PROCEDURE RETURNS[JunctionPtr];
FreeList:PROCEDURE[LONG POINTER];
FreePlace:PROCEDURE[PlacePtr];
FreePath:PROCEDURE[PathPtr];
FreePathway:PROCEDURE[PathwayPtr];
FreeGrid:PROCEDURE[GridPtr];
FreeRun:PROCEDURE[RunPtr];
FreeConn:PROCEDURE[ConnPtr];
FreeJunction:PROCEDURE[JunctionPtr];
FreeSilicon:PROCEDURE[SiliconPtr];
Return:PROCEDURE;
ShowLabel:PROCEDURE[STRING];
ShowString:PROCEDURE[STRING];
ShowChar:PROCEDURE[CHARACTER];
ShowDecimal:PROCEDURE[i:INTEGER,s:STRING←NIL];
ShowCircuit:PROCEDURE[c:Circuit] RETURNS[CHARACTER];
SameString:PUBLIC PROCEDURE[a,b:STRING] RETURNS[BOOLEAN];
WritePoint:PROCEDURE[x,y:INTEGER];
ShowPoint:PROCEDURE[s:STRING,x,y:INTEGER];
ShowWire:PROCEDURE[SiliconPtr];
Clear:PROCEDURE[s:STRING];
MakeType:PROCEDURE[n,e,s,w:BOOLEAN] RETURNS[InterType];
--from RouteMakeBlue
MakeBlue:PROCEDURE;
--from RouteSilicon
MakeBlueWire:PROCEDURE[hor:BOOLEAN,x,y,l:Lambda];
MakeRedWire:PROCEDURE[hor:BOOLEAN,x,y,l:Lambda];
MakeContact:PROCEDURE[x,y:Lambda];
--from RouteInter
InterSilicon:PROCEDURE[inter:RectanglePtr];
WhereIs:PROCEDURE[PathPtr,Side,RunNo] RETURNS[RunNo];
--from RouteChipmonkPlot
StartPlot,EndPlot:PROCEDURE;
PlotCell:PROCEDURE[CellPtr];
PlotBlueWire:PROCEDURE[hor:BOOLEAN,x,y,l:Lambda];
PlotRedWire:PROCEDURE[hor:BOOLEAN,x,y,l:Lambda];
PlotBlueRedContact:PROCEDURE[x,y:Lambda];
GetChipmonkString:PROCEDURE[result,prompt1:STRING,prompt2,prompt3:STRING←NIL];
Interrupt:ERROR; --raised by GetChipmonkString when push the rightmost
--unlabeled key, asking to abort;
allPaths:PathListPtr; --between paths1 and paths2
--all global variables are implemented in Utilities
channels:RectangleListPtr; --Rectless.MakeSecondaryLists
problem:Problem;
example:INTEGER;
chipmonk,plot,print:BOOLEAN;
inters:RectangleListPtr; --Rectless.MakeSecondaryLists
topology:TopologyListPtr;
paths:PathwayListPtr;
layout:SiliconListPtr;
rectangles:RectangleListPtr; --Rectangle.NewRect
END.
Timing
key Parameters: C: #cells E: #events (sources) k1: # channels/circuit= 2
derived pars:
RECT: # rectangles = 4C
CHAN: # channels = 2C
INTER: # intersections = 2C
RUNS: # runs / channel = E/2C
CONN: # conns / channel= E/C
SILICON: # mask objects= 16E
Crosses: CHAN (CONN*CONN*RUN) = E (E/C)**2
Checker: (SILICON + ALLSIGNALS) squared = (17E)**2
Inter: INTER (ALLPATHS + IWIRES) = E (4C+8)
MakeBlue: SILICON(SILICON + LIST(LIST+CELL)) = 16E(16E + *10(C+10))
Silicon: E(E/C+20)