DIRECTORY Core, CoreFlat, CoreRoute, RefTab, Rope, Route, RTSets, SC, SCInstUtil, SCNetUtil, SCPrivate, SCRowUtil; SCNetUtilImpl: CEDAR PROGRAM IMPORTS CoreRoute, RefTab, Rope, SC, SCInstUtil, SCNetUtil, SCRowUtil EXPORTS SCNetUtil SHARES SC = BEGIN DefineNet: PUBLIC PROC [handle: SC.Handle, flatWire: CoreFlat.FlatWire] RETURNS [net: SCPrivate.Net] = { structureData: SCPrivate.StructureData = NARROW[handle.structureData]; rules: Route.DesignRules = handle.rules.rowRules; name: Rope.ROPE = CoreRoute.LabelFlatWire[handle.coreCellType, flatWire^]; IF RefTab.Fetch[structureData.nets, flatWire].found THEN SC.Error[callingError, Rope.Cat["Redefinition of net ", name]]; net _ NEW[SCPrivate.NetRec _ [name: name, publicWire: NIL, trunkWidth: rules.trunkWidth, branchWidth: rules.branchWidth, routeTopology: ALL[[none, none]], pins: NIL]]; net.ftsOnRow _ RTSets.RTLgSetEmpty; net.chanExits[left] _ net.chanExits[right] _ RTSets.RTLgSetEmpty; IF NOT RefTab.Insert[structureData.nets, flatWire, net] THEN ERROR; -- tested just before... }; FindNet: PUBLIC PROC [handle: SC.Handle, flatWire: CoreFlat.FlatWire] RETURNS [net: SCPrivate.Net] ~ { structureData: SCPrivate.StructureData = NARROW[handle.structureData]; net _ NARROW [RefTab.Fetch[structureData.nets, flatWire].val]; IF net=NIL THEN SC.Error[callingError, Rope.Cat["Net not found : ", CoreRoute.LabelFlatWire[handle.coreCellType, flatWire^]]]; }; FindPublicNet: PUBLIC PROC [handle: SC.Handle, wire: Core.Wire] RETURNS [net: SCPrivate.Net] ~ { flatWire: CoreFlat.FlatWire = NEW [CoreFlat.FlatWireRec _ [flatCell: CoreFlat.rootCellType, wireRoot: public, wire: wire]]; net _ FindNet[handle, flatWire]; }; EnumerateNets: PUBLIC PROC [handle: SC.Handle, eachNet: SCNetUtil.EachNetProc] RETURNS [quit: BOOL] ~ { EachNet: RefTab.EachPairAction ~ { net: SCPrivate.Net = NARROW [val]; IF net.pins#NIL THEN quit _ eachNet[net]; }; structureData: SCPrivate.StructureData _ NARROW[handle.structureData]; quit _ RefTab.Pairs[structureData.nets, EachNet]; }; NetsOnInst: PUBLIC PROC[insts: SCPrivate.InstanceList] RETURNS [nets: SCPrivate.NetList _ NIL] ~ { WHILE insts#NIL DO -- enumerate required instances inst: SCPrivate.Instance = insts.first; insts _ insts.rest; FOR i: NAT IN [0..inst.pinNets.size) DO -- enumerate PinNets on instance net: SCPrivate.Net = inst.pinNets[i].net; IF net=NIL THEN LOOP; -- ignore NIL nets FOR netList: SCPrivate.NetList _ nets, netList.rest WHILE netList#NIL DO IF netList.first=net THEN EXIT; -- net is already in the result list REPEAT FINISHED => nets _ CONS [net, nets]; -- new net connected ENDLOOP; -- adding net to list ENDLOOP; -- enumerating pins on instance ENDLOOP; -- enumerating list of instances }; InstsOnNets: PUBLIC PROC[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 PROC[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; }; EnumeratePinsOnNet: PUBLIC PROC [net: SCPrivate.Net, eachPin: SCNetUtil.EachPinProc] RETURNS [quit: BOOL _ FALSE] ~ { FOR netPin: SCPrivate.NetPin _ net.pins, netPin.link UNTIL (netPin=NIL OR quit) DO quit _ eachPin[netPin]; ENDLOOP; }; AddConnection: PUBLIC PROC [handle: SC.Handle, net: SCPrivate.Net, instance: SCPrivate.Instance, pin: SCPrivate.ObjectPin, pinIndex: NAT, pinClass: SCPrivate.PinType] ~ { net.pins _ NEW [SCPrivate.NetPinRec _ [pinClass: pinClass, instance: instance, pin: pin, link: net.pins]]; -- add pin ahead of list instance.pinNets.n[pinIndex] _ NEW[SCPrivate.PinNetRec _ [pin: pin, pinInChan: NIL, net: net]]; }; RemoveConnections: PUBLIC PROC [handle: SC.Handle, instance: SCPrivate.Instance] ~ { pinNets: SCPrivate.PinNets _ instance.pinNets; FOR index: NAT IN [0 .. pinNets.size-1] DO pinNets.n[index] _ NIL ENDLOOP; }; RemoveFtsOnNet: PUBLIC PROC [handle: SC.Handle, net: SCPrivate.Net] ~ { result: SCPrivate.NetPin _ NIL; -- the new result source: SCPrivate.NetPin _ net.pins; -- the initial pins WHILE source#NIL DO nextPin: SCPrivate.NetPin = source.link; -- link may be overwritten IF source.pinClass#ftPin THEN {source.link _ result; result _ source}; -- add to result source _ nextPin; ENDLOOP; net.pins _ result; }; ExitOnSide: PUBLIC PROC [handle: SC.Handle, net: SCPrivate.Net, side: SC.Side] RETURNS [onThisSide: BOOLEAN] ~ { EachInstance: SCRowUtil.EachInstProc ~ { CheckPin: SCInstUtil.EachPinProc = { IF netPin.net = net THEN quit _ TRUE; }; quit _ SCInstUtil.EnumeratePinsOnInst[instance, CheckPin]; }; onThisSide _ SCRowUtil.EnumerateAllInstsOnSide[handle, side, EachInstance]; }; END. nSCNetUtilImpl.mesa Copyright Σ 1986, 1987 by Xerox Corporation. All rights reserved. Frank Bowers January 27, 1986 4:15:38 pm PST Preas September 29, 1987 3:59:15 pm PDT Cong, August 20, 1987 5:47:10 pm PDT Jean-Marc Frailong October 14, 1987 12:54:23 pm PDT chan utility routines Global data structure maintenance Create a net corresponding to a canonical flat wire & scream if already defined net.num _ nets.count; Locate a net by coresponding canonical flat wire, scream if not found Locate a net by the corresponding public wire, scream if not found Enumerate all nets that have pins on them Nets and instances Return the list of all nets that are connected to the list of instances. The returned list has no duplicates Nets and pins Connections Utilities Remove all feedthroughs from the net list [instance: SCPrivate.Instance, pin: NAT, netPin: SCPrivate.PinNet] Κ˜šœ™IcodešœB™BKšœ)Οk™,Kšœ!™'K™$K™3J˜—šœ™J™—š ˜ Jšœ8œ.˜hJ˜—šΠln œœ˜Jšœœ"˜EJšœ ˜Jšœœ˜ J˜Jš˜J˜—head™!š Οn œœœ œ&œ˜hKšœ Οb œ&™OKšœ)œ˜FKšœ1˜1Kšœ œ;˜JKšœ2œœ=˜xKš œœ-œOœœ˜§K™Kšœ#˜#KšœA˜AKš œœ2œœΟc˜\Kšœ˜K˜—š Ÿœœœ œ&œ˜fKšœ  œ™EKšœ)œ˜FKšœœ2˜>Kšœœœœl˜~K˜K˜—š Ÿ œœœ œœ˜`K™BKšœœZ˜{Kšœ ˜ K˜K˜—š Ÿ œœœ œ)œœ˜gK™)šŸœ˜"Kšœœ˜"Kšœ œœ˜)K˜—Kšœ)œ˜FKšœ1˜1K˜——™š Ÿ œœœ œœ˜bK™lšœœœ‘˜2Kšœ'˜'K˜š œœœœ‘ ˜HKšœ)˜)Kš œœœœ‘˜(šœ1œ œ˜HKšœœœ‘$˜DKšœœ œ‘˜@Kšœ‘˜—Kšœ‘˜(—Kšœ‘ ˜)—K˜K˜—š Ÿ œœœœ"œ˜cJš Ÿœœ œœ œ˜ZJšœ4˜4Jšœ˜J˜—š Ÿœœœ<œœœ˜}J˜šŸœ˜"Jšœ/˜/šœ œœ˜Jšœœœ˜š œAœœœ˜jJšœœ œ˜3Jšœ˜—Jšœœ œ.˜JJšœ˜—Jšœ˜—Jšœ œ˜$š œ1œ œœ˜TJšœ:˜:Jšœ˜—Jšœ˜——™ š Ÿœœœ6œœœ˜uš œ2œ œœ˜RKšœ˜Kšœ˜—Jšœ˜——™ š Ÿ œœœ œ_œ"˜ͺKšœ œ]‘˜ƒKšœœ-œ ˜_Kšœ˜K˜—šŸœœœ œ*˜TJšœ.˜.Jš œœœœœœ˜JJšœ˜K˜——™ šŸœœœ œ ˜GJ™)Jšœœ‘˜1Jšœ%‘˜8šœœ˜Kšœ)‘˜CKšœœ*‘˜WK˜Kšœ˜—Jšœ˜Jšœ˜K˜—šŸ œœœ œ#œœœ˜pšŸ œ˜(šŸœ˜$JšΟi$Πik’™BKšœœœ˜%Kšœ˜—Jšœ:˜:Jšœ˜—KšœK˜KKšœ˜K˜——Jšœ˜J˜J˜—…—ͺ,