DIRECTORY Core, CoreOps, CoreProperties, Rope, Route, RTSets, SC, SCInstUtil, SCNetUtil, SCPrivate, SCUtil; SCNetUtilImpl: CEDAR PROGRAM IMPORTS CoreOps, CoreProperties, SCInstUtil, SCNetUtil, SCUtil EXPORTS SCNetUtil SHARES SC = BEGIN NetsOnInst: PUBLIC PROCEDURE[insts: SCPrivate.InstanceList] RETURNS [nets: SCPrivate.NetList _ NIL] = BEGIN PinProc: SCInstUtil.EachPinProc = { IF netPin.net # NIL THEN { net: SCPrivate.Net _ NIL; FOR netList: SCPrivate.NetList _ nets, netList.rest WHILE netList # NIL AND net # NIL DO IF netList.first = netPin.net THEN net _ netList.first; ENDLOOP; IF net # NIL THEN nets _ CONS[net, nets]}}; FOR instList: SCPrivate.InstanceList _ insts, instList.rest WHILE instList # NIL DO inst: SCPrivate.Instance _ instList.first; [] _ SCInstUtil.EnumeratePinsOnInst[inst, PinProc]; ENDLOOP; END; InstsOnNets: PUBLIC PROCEDURE[nets: SCPrivate.NetList] RETURNS [insts: SCPrivate.InstanceList _ NIL] = { InstProc: SCNetUtil.EachInstProc = { IF instance # NIL THEN insts _ CONS[instance, insts]}; [] _ SCNetUtil.EnumerateInstsOnNets[nets, InstProc]}; EnumerateInstsOnNets: PUBLIC PROCEDURE[nets: SCPrivate.NetList, eachInst: SCNetUtil.EachInstProc] RETURNS [quit: BOOL _ FALSE] = { PinProc: SCNetUtil.EachPinProc = { instance: SCPrivate.Instance _ netPin.instance; IF instance # NIL THEN { found: BOOLEAN _ FALSE; FOR instanceList: SCPrivate.InstanceList _ insts, instanceList.rest WHILE instanceList # NIL AND ~found DO IF instanceList.first = instance THEN found _ TRUE; ENDLOOP; IF ~found THEN {insts _ CONS[instance, insts]; quit _ eachInst[instance]}}}; insts: SCPrivate.InstanceList _ NIL; FOR netList: SCPrivate.NetList _ nets, netList.rest WHILE netList # NIL AND ~quit DO [] _ SCNetUtil.EnumeratePinsOnNet[netList.first, PinProc]; ENDLOOP; }; EnumerateNets: PUBLIC PROC [handle: SC.Handle, eachNet: SCNetUtil.EachNetProc] RETURNS [quit: BOOL _ FALSE] = { structureData: SCPrivate.StructureData _ NARROW[handle.structureData]; nets: SCPrivate.Nets _ structureData.nets; FOR n: NAT IN [1 .. nets.count] WHILE ~quit DO quit _ eachNet[n, nets.nets[n]]; ENDLOOP; }; EnumeratePinsOnNet: PUBLIC PROC [net: SCPrivate.Net, eachPin: SCNetUtil.EachPinProc] RETURNS [quit: BOOL _ FALSE] = { FOR pinList: SCPrivate.NetPinsList _ net.pins, pinList.rest WHILE pinList # NIL AND ~quit DO quit _ eachPin[pinList.first]; ENDLOOP}; AddConnection: PUBLIC PROCEDURE [handle: SC.Handle, net: SCPrivate.Net, instance: SCPrivate.Instance, pin: SCPrivate.ObjectPin, pinIndex: NAT] = { netPin: SCPrivate.NetPin _ NEW[SCPrivate.NetPinRec]; netPin.instance _ instance; netPin.pin _ pin; instance.pinNets.n[pinIndex] _ [pin, net]; net.pins _ CONS[netPin, net.pins]}; RemoveConnections: PUBLIC PROCEDURE [handle: SC.Handle, instance: SCPrivate.Instance] = { pinNets: SCPrivate.PinNets _ instance.pinNets; FOR index: NAT IN [1 .. pinNets.size] DO pinNets.n[index].pin _ NIL; pinNets.n[index].net _ NIL; ENDLOOP}; DefineNet: PUBLIC PROCEDURE [handle: SC.Handle, wire: Core.Wire] RETURNS [net: SCPrivate.Net _ NIL] = { structureData: SCPrivate.StructureData _ NARROW[handle.structureData]; rules: Route.DesignRules _ handle.rules.rowRules; nets: SCPrivate.Nets _ structureData.nets; netName: Rope.ROPE _ NARROW[CoreProperties.GetWireProp[wire, CoreOps.nameProp]]; acBus: SCPrivate.AcBus _ SCUtil.FindBus[handle, netName]; nets.count _ nets.count + 1; net _ NEW[SCPrivate.NetRec _ [name: netName, netNum: nets.count, trunkWidth: rules.trunkWidth, branchWidth: rules.branchWidth, routeTopology: ALL[[none, none]]]]; net.netNum _ nets.count; nets.nets[nets.count] _ net; IF acBus = NIL THEN net.feedThrusAllowed _ TRUE ELSE {net.feedThrusAllowed _ FALSE; acBus.net _ net}; net.ftsOnRow _ RTSets.RTMdSetEmpty; net.chanExits[left] _ net.chanExits[right] _ RTSets.RTMdSetEmpty}; RemoveFtsOnNet: PUBLIC PROCEDURE[handle: SC.Handle, net: SCPrivate.Net] = { EachPin: SCNetUtil.EachPinProc = { IF netPin.pinClass = compPin THEN { IF netPin.instance.whichClass # ft THEN pinList _ CONS [netPin, pinList] ELSE pinList _ CONS [netPin, pinList]}}; pinList: SCPrivate.NetPinsList _ NIL; [] _ SCNetUtil.EnumeratePinsOnNet[net, EachPin]; net.pins _ pinList}; END. file ///StdCell/SCNetUtilImpl.mesa Frank Bowers January 27, 1986 4:15:38 pm PST chan utility routines find nets attached to component determine components on net determine components on net define a net get signals to roue without feedthrus remove the fts on a net list Κ.˜šœ"™"Icode™,—J˜Jšœ™J™šΟk ˜ J˜J˜J˜J˜J˜Jšœ˜Jšœ˜J˜ Jšœ ˜ Jšœ ˜ Jšœ˜J˜—šœœ˜Jšœ7˜>Jšœ ˜Jšœœ˜ J˜Jš˜J˜Jšœ ™ š Οn œœ œ œœ˜fJ˜Jš˜˜#šœœœ˜Jšœœ˜š œ1œ œœœ˜XJšœœ˜7Jšœ˜—Jšœœœœ˜+J˜——šœ9œ œ˜SJšœ*˜*J˜3Jšœ˜—Jšœ˜—J˜Jšœ™š ž œœ œœ"œ˜hJ˜šœ$˜$šœ œœ œ˜6J˜——Jšœ5˜5J˜—Jšœ™š žœœ œ<œœœ˜‚J˜˜"Jšœ/˜/šœ œœ˜Jšœœœ˜š œAœœœœ˜jJšœœ˜3Jšœ˜—šœ˜Jšœ œ0˜=—J˜——Jšœ œ˜$š œ1œ œœ˜TJšœ:˜:Jšœ˜—Jšœ˜J˜—š ž œœœ œ)œ œ˜oK˜Kšœ)œ˜FKšœ*˜*š œœœœœ˜/Kšœ ˜ Jšœ˜—K˜Kšœ˜—š žœœœ6œœœ˜uK˜š œ9œ œœœ˜]Kšœ˜Jšœ˜ ——K˜š ž œœ œ œ_œ˜’K˜Kšœœ˜4Kšœ˜Kšœ˜Kšœ*˜*Kšœ œ˜#—K˜šžœœ œ œ*˜YJšœ.˜.šœœœ˜(Jšœœ˜Jšœ˜Jšœ ˜ ——K˜šž œœ œ œ˜@Kšœœ˜&K™Kšœ ™ Kšœ)œ˜FKšœ1˜1Kšœ*˜*Kšœœ5˜PKšœ9˜9K˜Kšœœ…œ˜’K˜Kšœ˜K˜Kšœ&™&Kšœ œœ˜/šœœ˜5K˜—Kšœ#˜#KšœB˜BK˜—Jšœ™šžœœ œ œ ˜KJ˜šœ"˜"šœœ˜#Jšœ!œ œ˜H—Jšœ œ˜(—J˜Jšœ!œ˜%Jšœ0˜0Jšœ˜—Jšœ˜—J˜J˜—…—Tž