DIRECTORY AbSets, Asserting, BiRelBasics, BiRels, IntStuff, IO, LichenDataOps, LichenDataStructure, LichenTransforms, LichenTransformsPrivate, TextReplace; LichenOtherTransforms: CEDAR PROGRAM IMPORTS AbSets, Asserting, BiRelBasics, BiRels, IntStuff, IO, LichenDataOps, LichenDataStructure, LichenTransforms, TextReplace EXPORTS LichenTransforms = BEGIN OPEN LichenDataStructure, LichenTransforms, LichenDataOps, LichenTransformsPrivate, Sets:AbSets; CellTypeList: TYPE ~ LIST OF CellType; GroupUnorganized: PUBLIC PROC [ design: Design, mapper: ConstFunction--any _ Seq (role f sibling: instance of array* of type of newType's roleth child)--] RETURNS [newType: CellType, pairs: BiRels.ConstOneToOne--domain of mapper f instance of array* of newType--, gcs: Seq--role f instance in newType--] ~ { ComputeName: PROC [] RETURNS [r: ROPE] ~ { pair: BiRels.Pair ~ mapper.First[].P; r _ IO.PutFR["#gen%g", [integer[nGen _ nGen+1]]]; RETURN}; newTypeName: ROPE ~ ComputeName[]; pairsV: BiRels.OneToOne ~ BiRels.CreateHashOTO[]; Seed: PROC [left, right: REF ANY] ~ { seq: Seq--role f sibling: instance of array* of type of newType's roleth child-- ~ BiRels.DeRef[right]; ci0: CellInstance ~ NARROW[seq.ApplyI[0].MA]; ti: CellInstance ~ FullyInstantiate[newType, ci0.containingCT]; pairsV.AddNewAA[left, ti]; RETURN}; newType _ CreateCellType[design, newTypeName, NIL, TRUE, TRUE, NIL, NIL]; mapper.EnumAA[Seed]; pairs _ pairsV.Freeze; gcs _ LowerChildren[design, newType, pairs.Invert.Compose[mapper].AsConst]; RETURN}; nGen: NATURAL _ 0; SimpleGrouper: PROC [design: Design, cellTypes: Set--of CellType--] RETURNS [grouper: ConstFunction--any _ Seq (role f sibling: instance of array* of cellTypes[role])--] ~ { roles: NATURAL ~ cellTypes.Size[].EN; ctSeq: Seq--role f CellType-- ~ BiRels.EnumSeqOfSet[cellTypes]; grouperV: BiRels.OneToOne ~ BiRels.CreateHashOTO[]; PerCellType: PROC [ra: Sets.Value] ~ { ct: CellType ~ NARROW[ra.VA]; IF ct.asUnorganized#NIL THEN { sibs: Seq--role f sibling: instance of array* of cellTypes[role]-- ~ CreateSeq[len: roles, oneToOne: TRUE]; PerInstance: PROC [ra: Sets.Value] ~ { ci: CellInstance ~ NARROW[ra.VA]; cit: CellType _ ci.type; DO mr: Sets.MaybeValue ~ ctSeq.ApplyA[cit, rightToLeft]; IF mr.found THEN { role: NAT ~ mr.it.VI; sibs.AddNewIA[role, ci]; RETURN}; IF cit.asArray=NIL THEN EXIT; cit _ cit.asArray.eltType; ENDLOOP; RETURN}; ct.asUnorganized.containedInstances.Enumerate[PerInstance]; SELECT sibs.Size[].EN FROM 0 => NULL; roles => grouperV.AddNewAA[ct, sibs.Freeze.Refify]; ENDCASE => ERROR; }; RETURN}; design.cellTypes.Enumerate[PerCellType]; grouper _ grouperV.Freeze; RETURN}; CellTypeListLength: PROC [cellTypes: CellTypeList] RETURNS [length: NATURAL] ~ { length _ 0; FOR cellTypes _ cellTypes, cellTypes.rest WHILE cellTypes # NIL DO length _ length + 1 ENDLOOP; RETURN}; BaseStar: PROC [ct: CellType] RETURNS [CellType] ~ { WHILE ct.asArray#NIL DO ct _ ct.asArray.eltType ENDLOOP; RETURN [ct]}; SteppyNameChange: TYPE ~ RECORD [old, new: SteppyName]; SNCList: TYPE ~ LIST OF SteppyNameChange; RopeChange: TYPE ~ RECORD [old, new: ROPE]; RCList: TYPE ~ LIST OF RopeChange; RenameSteps: PUBLIC PROC [design: Design, classFilter: EntityClassFilter, map: RopeMap] RETURNS [nChanged: ARRAY EntityClass OF CARD _ ALL[0]] ~ { FixPort: PROC [port: Port] ~ { names: Set--of SteppyName-- ~ port.PortNames[]; changes: SNCList ~ FindChanges[names, map]; IF changes#NIL THEN nChanged[Port] _ nChanged[Port]+1; FOR cl: SNCList _ changes, cl.rest WHILE cl#NIL DO IF NOT ForgetPortName[port, cl.first.old] THEN ERROR; [] _ KnowPortName[port, cl.first.new]; design _ design; ENDLOOP; RETURN}; FixVertex: PROC [v: Vertex, class: EntityClass] ~ { changes: SNCList ~ FindChanges[v.VertexNames[], map]; IF changes#NIL THEN nChanged[class] _ nChanged[class]+1; FOR cl: SNCList _ changes, cl.rest WHILE cl#NIL DO ForgetVertexName[v, cl.first.old]; KnowVertexName[v, cl.first.new]; design _ design; ENDLOOP; RETURN}; FixWire: PROC [wire: Wire] RETURNS [doKids, moreSibs: BOOL _ TRUE] ~ {FixVertex[wire, Wire]}; FixInstance: PROC [ra: REF ANY] ~ {FixVertex[NARROW[ra], CellInstance]}; PerCellType: PROC [ra: REF ANY] ~ { ct: CellType ~ NARROW[ra]; IF classFilter[CellType] THEN { changes: RCList _ NIL; CheckName: PROC [assertion: Assertion] ~ { old: ROPE ~ NARROW[Asserting.TermOf[assertion]]; new: ROPE ~ map.Apply[old]; IF new#old THEN changes _ CONS[[old, new], changes]; RETURN}; Asserting.EnumerateAssertionsAbout[nameReln, ct.otherPublic, CheckName]; IF changes#NIL THEN nChanged[CellType] _ nChanged[CellType]+1; FOR cl: RCList _ changes, cl.rest WHILE cl#NIL DO ct.otherPublic _ Asserting.Remove1[nameReln, cl.first.old, ct.otherPublic, TRUE]; ct.otherPublic _ Asserting.Assert1[nameReln, cl.first.new, ct.otherPublic]; ENDLOOP; }; IF classFilter[Port] THEN ct.EnumeratePorts[FixPort]; IF ct.asUnorganized#NIL THEN { IF classFilter[Wire] THEN [] _ ct.asUnorganized.internalWire.EnumerateWire[FixWire]; IF classFilter[Wire] THEN ct.asUnorganized.containedInstances.EnumA[FixInstance]; }; RETURN}; design.cellTypes.EnumA[PerCellType]; RETURN}; FindChanges: PROC [names: Set--of SteppyName--, map: RopeMap] RETURNS [changes: SNCList _ NIL] ~ { FindChange: PROC [val: Sets.Value] ~ { oldName: SteppyName ~ VSn[val]; oldSteps: NameStepList ~ oldName.steps; cur: NameStepList _ oldSteps; copied: BOOL _ FALSE; WHILE cur#NIL DO WITH cur.first SELECT FROM x: REF INT => NULL; x: ROPE => {y: ROPE ~ map.Apply[x]; IF x#y THEN { IF copied THEN cur.first _ y ELSE { moded: TList ~ CopyTil[[cur.rest]].Prepend[y]; new: NameStepList ~ CopyTil[[oldSteps, cur]].Cat[moded].head; cur _ moded.head; changes _ CONS[[oldName, LSn[new]], changes]; copied _ TRUE}}}; ENDCASE => ERROR; cur _ cur.rest; ENDLOOP; RETURN}; names.Enumerate[FindChange]; RETURN}; END. ΈLichenOtherTransforms.Mesa Last tweaked by Mike Spreitzer on February 2, 1988 11:54:15 am PST l {ti _ Instantiate[newType, seq[0].parent]; pairs _ pairs + } Κq˜™IcodešœB™B—J˜KšΟk œ3œ]˜›K˜šΟnœœ˜$Kšœ3œC˜Kšœ˜Kšœ˜—K˜KšœœPžœ˜fK˜Kšœœœœ ˜&K˜šžœœ˜šœ˜Kšœ˜Kš œΟcΠcmŸ  ŸΠcuŸ‘Ÿ œ˜j—šœ˜KšœŸ Ÿ‘Ÿ œ˜PKšœŸ Ÿœ˜+—šž œœœœ˜*Kšœ%˜%Kšœœ+˜1Kšœ˜—Kšœ œ˜"Kšœ1˜1šžœœœœ˜%KšΟgœQ™RKš œŸ Ÿ‘Ÿ‘Ÿœ˜gKšœœœ˜-Kšœ?˜?Kšœ˜Kšœ˜—Kš œ.œœœœœ˜IKšœ˜Kšœ˜KšœK˜KKšœ˜Kšœœ˜—K˜šž œœ ŸœœŸ Ÿ  Ÿ‘Ÿœ˜­Kšœœœ˜%Kšœ Ÿ Ÿ œ"˜?Kšœ3˜3šž œœ˜&Kšœœœ˜šœœœ˜Kš œ Ÿ Ÿ‘Ÿœ#œ˜kšž œœ˜&Kšœœœ˜!K˜š˜Kšœ5˜5šœ œ˜Kšœœ œ˜Kšœ˜Kšœ˜—Kšœ œœœ˜Kšœ˜Kšœ˜—Kšœ˜—Kšœ;˜;šœ œ˜Kšœœ˜ Kšœ3˜3Kšœœ˜—K˜—Kšœ˜—K˜(Kšœ˜Kšœ˜—K˜šžœœœ œ˜PK˜ Kš œ'œ œœœ˜_Kšœ˜—K˜šžœœœ˜4Kšœ œœœ˜8Kšœ˜ —K˜Kšœœœ˜7Kšœ œœœ˜)Kšœ œœ œ˜+Kšœœœœ ˜"K˜šž œœœ@œ œ œœœ˜’šžœœ˜Kšœ Ÿœ˜/Kšœ+˜+Kšœ œœ#˜6šœ œœ˜2Kšœœ$œœ˜5Kšœ&˜&Kšœœ˜—Kšœ˜—šž œœ$˜3Kšœ5˜5Kšœ œœ%˜8šœ œœ˜2Kšœ"˜"Kšœ ˜ Kšœœ˜—Kšœ˜—Kš žœœœœœ˜]Kš ž œœœœœ˜Hšž œœœœ˜#Kšœœ˜šœœ˜Kšœœ˜šž œœ˜*Kšœœœ˜0Kšœœ˜Kšœ œ œ˜4Kšœ˜—KšœH˜HKšœ œœ+˜>šœœœ˜1KšœKœ˜QKšœK˜KKšœ˜—K˜—Kšœœ˜5šœœœ˜Kšœœ;˜TKšœœ8˜QK˜—Kšœ˜—Kšœ$˜$Kšœ˜—K˜š ž œœ Ÿœœœ˜bšž œœ˜&Kšœ˜Kšœ'˜'Kšœ˜Kšœœœ˜šœœ˜šœ œ˜Kšœœœœ˜š œœœœœ˜1šœœœ˜#Kšœ.˜.Kšœ=˜=K˜Kšœ œ˜-Kšœ œ˜——Kšœœ˜—K˜Kšœ˜—Kšœ˜—Kšœ˜Kšœ˜—K˜Kšœ˜—…—€Ν