• No results found

We gaan er vanuit dat voor dat we het floorplan gaan bedraden er uit de floorplan file, zoals die door de globale bedrader is geschreven, reeds een boom gecreëerd is en dat van daaruit alle benodigde informatie te bereiken is .

Het doorlopen van de boom

We starten het algoritme uiteraard vanuit de wortel van de boom en lopen daarvan van links naar rechts de kinderen langs op zoek naar een kanaal . Stel nu dat de boom niet binair is en dat we kijken naar een deel van het floorplan zoals dat is weergegeven in figuur 16 .

Figuur 16 : Een rij na het bedraden van alle subcellen

Als we nu een kanaal bedraden zodra de beide buren bedraad zijn ontstaat de situatie zoals in de figuur aangegeven . Het moge duidelijk zijn dat het nu lastig wordt om op een efficiënte wijze het lege oppervlak op te vullen . Dit voorkomen we door eerst alle

kinderen af te lopen en de subbomen die we tegenkomen te bedraden, zoals in algoritme 7 .1 . Als we dit gedaan hebben weten we hoe hoog (breed) deze rij (kolom) moet worden . Nu lopen we alle kinderen opnieuw af . Voor alle cellen, of dit nu een subboom is of een module, kunnen we nu gemakkelijk, indien nodig, het gat opvullen zoals beschreven in hoofdstuk 5 .5 . Aan de kanalen moeten we nu poorten toevoegen voor de netten die het kanaal links en rechts verlaten, waarna het kanaal bedraad kan worden . Daarna moet er uiteraard nog een compositie gemaakt worden .

function wire (T) begin

(Start in the root of the tree}

maxsize = 0 ;

for all children of T begin if child is a row or column then

{the subtrees have to be wired}

wire (child);

(decide the size of the biggest child}

if (T is a row) and (heighth of c' d> maxsize) then maxsize = heighth of child ;

else if (T is a column) and (breadth of child > maxsize) then maxsize = breadth of child ;

end ; {for}

for all children of T begin (fill the gaps and rout the channels

if child is a module or a subtree then begin

if (T is a row) and (heighth of child < maxsize) then fill ap (child) ;

else ifg(T is a column) and (breadth of child < maxsize) then fill ap (child) ;

end ; fly

if child is a channel or a gap then rout (child) ;

end ; ffor}

Make composition of (T);

end ; (wire)

Algoritme 7 .1 : Het doorlopen van de boom Het bedraden van een kanaal

In algoritme 7 .1 wordt rout (child) aangeroepen . De beschrijving daarvan wordt

gegeven in algoritme 7 .2 . Dit algoritme behoeft verder geen toelichting, maar er zij op gewezen dat bij het creëren van de lokale netlijst op een aantal details moet worden gelet .

Het creëren van de lokale netlijst

Welke netten er in het kanaal voor komen is al bekend ; deze informatie wordt immers door de globale bedrader gegeven in de floorplan file . De poorten die aan het kanaal blijken te liggen moeten we dus toevoegen aan het juiste net en de coórdinaten van die poorten moeten worden aangepast . Deze gaven de ligging weer ten opzichte van de cel, maar moeten nu de ligging ten opzichte van het kanaal weer gaan geven . Verder moet er bij deze stap gekeken worden naar voedingsbedrading en moeten er in een

-29-function rout (child) b

create channel specifi catton}

create local netlist (child) ; (write fnput,~`rle for channel router) write file (child) ;

{call the channel router) if child is a gap then

(minimum heighth is needed

channel_rout (child, heigh of child) ; else {child is a channel}

channel_rout (child) ;

(read the final position of the ports at the channel side) read file (child) ;

end ;

Algoritme 7 .2 : Het bedraden van een kanaal

randkanaal eventueel netten naar buiten worden gestuurd . Eén en ander is beschreven in algoritme 7 .3 .

function create local netlist (child) I

check all ports of both neighbours) or all ports of left and right neighbour do b

fi~port at channel side then

(look for proper net in the momentary local netlist}

net = get net (port) ;

if net then [Zhe proper net was found) add~ort_to netlist (port, local netlist) ;

else {the net qfthe pon wasn't in the local netlist already) if type of port is power then

add power net to local netlist ;

if net needs connection to the outside world and child is a borderchannel then add_extern_port (child) ;

end; ifor)

check for power nets}

~or all nets in local netlist do

~if nnet is power net then

add wer port to channel side ; end; {forr

{channel width may be not big enough anymore for the width of the power nets) channel width = power width + 1 ;

{some ports now may be not on the channel borders anymore) for all nets in local netlist do

be~n

for all ports on net do update_coSrdinates (port) ; end;

add the ports on the channel sides to the local netlist) for all ports of child do

begin

net = get_net (port);

add rt to _netlist (port, local netlist) ; end; or}

end;

Algoritme 7 .3 : Het creëren van de lokale netlijst

Het maken van de compositie

Nadat alle kinderen van een knooppunt in de boom bedraad zijn moet er nog een compositie gemaakt worden . Dit is niets meer dan hetgeen in hoofdstuk 5 .2

beschreven is, hetgeen door algoritme 7 .4 wordt weergegeven . Met de compositie van de kinderen van de wortel hebben we een cel die de hele ontworpen module voorstelt .

function composition (T, maxsize) belo

size = 0 ;

for all children of T do for an ports of child do

belpif port not on channel side then update coSrdinates (port) ; end;

if T is a row then

size = size + breadth of child;

else (T is a column)

size = size + heighth of child;

end ;

if T is a row then beh~ghth of T = maxsize;

breadth of T = size ;

Algoritme 7 .4 : Het maken van een compositie

7 .2 Complexiteit

Kijken we naar de complexiteit van de verschillende stappen in het algoritme, dan valt, zonder in een uitgebreide complexiteits analyse te vervallen, vrij gemakkelijk in te zien welke stappen de complexiteit van het geheel bepalen .

Zo moet bij het creëren van de lokale netlijst per poort aan het kanaal de netlijst worden afgezocht naar het net waar de poort aan moet komen te hangen, een complexiteit dus van O(pn), met p het aantal poorten en n het aantal netten . Verder moeten hier

eventueel poorten naar de buitenwereld worden toegevoegd en moet de breedte van de voedingsbedrading bepaald worden . Het toevoegen van poorten is in constante tijd te doen . De breedte van de voedingsbedrading hangt af van de breedte van alle poorten aan dat net, die we dus allemaal af moeten lopen . De benodigde tijd voor het bepalen van de breedte van de voedingsnetten is dus lineair met het aantal poorten en is dus duidelijk niet bepalend voor de complexiteit van het creëren van de lokale netlijst . Deze hangt duidelijk af van het zoeken naar het juiste net voor elke poort .

-31-Er zij op gewezen dat voor het vinden van het juiste net voor elke poort waarschijnlijk nog wel een efficiënter algoritme te vinden is . Op het moment van het schrijven van dit verslag is daar echter nog geen aandacht aan besteed .

Een andere bepalende stap is de functie read file (child) in algoritme 7 .2, de functie voor het lezen van de layout file van een kanaal . We doen dit om te zien waar precies de kanaal bedrader netten naar buiten stuurt . De coSrdinaten van de poorten die we hiervoor aan het kanaal hadden toegevoegd moeten hierop worden aangepast . In het uiterste geval zijn dit er 2n, namelijk het geval dat alle netten door het kanaal heen gaan en dus zowel links als rechts het kanaal verlaten . Voor elk van die poorten staat er nu een regel in de layout file . Als we een dergelijke regel lezen moeten we dus alle poorten afzoeken om die poort te vinden waar deze regel over gaat . Dit levert dus een

complexiteit van O(W) . Ook hiervoor geldt dat waarschijnlijk nog een efficiënter algoritme te vinden is .

Alle andere, niet nader genoemde functies zijn lineair, zodat op dit moment het

algoritme kwadratisch is door de bovengenoemde twee stappen . Door het kiezen van goede datastructuren en efficiënt programmeren is er nog wel voor gezorgd dat het vinden van het juiste net voor elke poort slechts in het slechtste geval kwadratisch is en dat dit in het gemiddelde geval bij benadering lineair is . Hierop wordt teruggekomen in hoofdstuk 8 .3 .