DIRECTORY AbSets, AMBridge, AMTypes, BasicTime, BiRelBasics, BiRels, IntStuff, IO, LichenDataOps, LichenDataStructure, LichenIntBasics, PrintTV, Rope, SetBasics; LichenWireMunging: CEDAR PROGRAM IMPORTS AbSets, BiRelBasics, BiRels, IntStuff, LichenDataOps, LichenDataStructure, SetBasics EXPORTS LichenDataOps = BEGIN OPEN IS:IntStuff, LIB:LichenIntBasics, LIB, LichenDataStructure, LichenDataOps, Sets:AbSets; steppyNameFunctions: Sets.Space ~ BiRelBasics.CreateBiRelSpace[ALL[steppyNameSpace]]; FixInterleavingsOfArray: PUBLIC PROC [act: CellType] ~ { a: Array ~ act.asArray; d: Design ~ act.d; ect: CellType ~ act.EltType[]; wire2ap: InvFn --DumbWire _ array Port-- ~ a.dumrep.apToWire.Invert; CheckEltPort: PROC [epv: Sets.Value] RETURNS [BOOL] ~ { ep: Port ~ NARROW[epv.VA]; cai2dw: Fn--composite array index _ DumbWire-- ~ BiRels.VB[a.dumrep.epToWire.Apply[epv].Val]; cais: Set--of composite array index-- ~ cai2dw.SetOn[left]; IF cais.Size[IS.two].Compare[IS.two] x, ENDCASE => NIL; Start1: PROC [v1: Sets.Value] RETURNS [BOOL] ~ { n1: SteppyName ~ VSn[v1]; IF n1.grade # n0.grade THEN RETURN [FALSE]; {tail1: NameStepList ~ n1.SNthTail[len-1].steps; last1: REF INT ~ WITH tail1.first SELECT FROM x: REF INT => x, ENDCASE => NIL; IF last1=NIL THEN RETURN [FALSE]; {sameLast: BOOL ~ last0^ = last1^; d0: NameStepList _ n0.steps; d1: NameStepList _ n1.steps; WHILE d0 # tail0 AND nameStepSpace.SEqual[AV[d0.first], AV[d1.first]] DO d0 _ d0.rest; d1 _ d1.rest; ENDLOOP; IF d0#tail0 THEN { IF NOT NameStepListEqual[d0.rest, d1.rest, tail0, tail1] THEN RETURN [FALSE]; ConsiderPattern[CopyTill[n0.steps, d0], CopyTill[d0.rest, tail0]]; } ELSE IF NOT sameLast THEN {ct _ ct; FOR l0: NameStepList _ n0.steps, l0.rest WHILE l0 # tail0 DO ConsiderPattern[CopyTill[n0.steps, l0], CopyTill[l0.rest, tail0]]; ENDLOOP; ct _ ct} ELSE ct _ ct; RETURN [FALSE]}}}; IF last0=NIL THEN RETURN [FALSE]; IF ns1.Scan[Start1].found THEN ERROR; RETURN [FALSE]}}; ConsiderPattern: PROC [pre, post: TList] ~ { base: SteppyName ~ LSn[CopyTill[pre.head, NIL].Cat[CopyTill[post.head, NIL]].head]; pat: SteppyNamePattern ~ LSn[Cat[Append[pre, anyROPE], Append[post, anyInt]].head]; r: OneToOne--old name f new-- ~ BiRels.CreateHashOTO[ALL[steppyNameSpace]]; pms: Set ~ matching.Mapping[SnV[pat]]; FOR i: NATURAL IN [0 .. n) DO ki: PW ~ newKids.ApplyI[i].MA; matchingNames: Set ~ pms.Intersection[ct.PartNames[class, ki]]; old: SteppyName ~ VSn[matchingNames.TheElt[!SetBasics.Error => IF msg=Sets.notASingleton THEN GOTO Bad]]; new: SteppyName ~ base.SNAppend[NewInt[i]]; had: BiRels.HadPair ~ r.AddPair[[SnV[old], SnV[new]]]; IF had # ALL[none] THEN GOTO Bad; ENDLOOP; {had: BiRels.Had ~ p2r.AddPair[[SnV[pat], r.BV[]], BiRels.addIfNew] [leftToRight]; IF had = different THEN ERROR--if it's the same pattern, it's got to have the same r--; IF p2n.AddPair[[SnV[pat], SnV[base]]][leftToRight] = different THEN ERROR; };RETURN; EXITS Bad => ct _ ct}; RemoveInferiors: PROC [pv: Sets.Value] RETURNS [BOOL] ~ { IF pats.HasMember[pv] THEN { losers: Set ~ difoverlap.Mapping[pv].Intersection[pats].CreateHashCopy[]; [] _ p2r.DeleteSet[losers]; [] _ p2n.DeleteSet[losers]}; RETURN [FALSE]}; IF ns0.Scan[Start0].found THEN ERROR; IF pats.Size.EN > 1 THEN nontrivs _ nontrivs + 1; IF pats.Scan[RemoveInferiors, patorder].found THEN ERROR; IF pats.Empty THEN {SIGNAL Hard; nhards _ nhards + 1} ELSE FOR i: NAT IN [0 .. n) DO ki: PW ~ newKids.ApplyI[i].MA; ri: REF INT ~ NewInt[i]; PerRepl: PROC [pair: BiRels.Pair] RETURNS [BOOL] ~ { pat: SteppyName ~ VSn[pair[left]]; r: OneToOne--old name f new-- ~ BiRels.VB[pair[right]]; parentName: SteppyName ~ VSn[p2n.Apply[pair[left]].Val]; new: SteppyName ~ SNAppend[parentName, ri]; old: SteppyName ~ VSn[r.Apply[SnV[new], rightToLeft].Val]; ReplaceDescendantsName[ct, ki, old, new]; RETURN [FALSE]}; IF p2r.Scan[PerRepl].found THEN ERROR; ENDLOOP; RETURN [p2n.SetOn[right]]}; sighard: BOOL _ TRUE; nhards, nontrivs: INT _ 0; Hard: SIGNAL ~ CODE; patorder: Sets.Order ~ [ComparePats, TRUE, FALSE, NIL]; ComparePats: PROC [data: REF ANY, v1, v2: Sets.Value] RETURNS [SetBasics.PartialComparison] ~ { l1: NameStepList _ VSn[v1].steps; l2: NameStepList _ VSn[v2].steps; WHILE l1#NIL AND l2#NIL DO e1: BOOL ~ l1.first=anyROPE; e2: BOOL ~ l2.first=anyROPE; IF e1#e2 THEN RETURN [IF e2 THEN less ELSE greater]; IF e1 THEN RETURN [equal]; l1 _ l1.rest; l2 _ l2.rest; ENDLOOP; ERROR}; END. ^LichenWireMunging.Mesa Last tweaked by Mike Spreitzer on August 3, 1988 3:29:04 pm PDT Κ [– "cedar" style˜code™Kšœ?™?—K˜KšΟk œFœP˜‘K˜šΟnœœ˜ KšœU˜\Kšœ˜K˜—K˜Kš œœœ œœ&žœ˜bK˜Kšœ?œ˜UK˜šžœœœ˜8K˜K˜Kšœ˜KšœΟcœ˜Dšž œœœœ˜7Kšœ œœ˜Kšœ ŸΠcmŸ œ œ#˜]Kšœ Ÿœ˜;Kš œ œœ œœœ˜?Kšœ*œ˜-Kšœ&œœ˜3Kšœ*œ˜-KšœΟgœ$˜(Kšœ Ÿ œ ‘œ˜?Kš œœœœœ˜/Kšœœ‘œ˜)Kšœ Ÿ Ÿ œ5œ˜oKšœC˜CKšœœœ œœœœœ˜OKš œ œœœœ˜*Kšœ#˜#Kšœ6˜6Kš œ œœœœœ˜CKš œœ3œœœ˜MKšœœœœ˜DKšœ+˜+Kšœœ˜—Kšœœ(œœ˜MKšœ˜—K˜š žœœŸ œŸ œœ˜mK˜Kšœœœ˜šžœœœœ˜1Kšœ œœ˜Kšœ˜Kšœœ˜—šžœœœœ˜2Kšœœœ˜"K˜Kšœ Ÿ œ ˜5Kšœ œœ˜šž œœœœ˜5K˜*Kš œœ œœœ˜%K˜Kšœ œœ˜Kšœœœ ˜"Kšœ œœŸ+œ˜FKšœœ˜—Kšœœœ˜,š œœœœ œ˜0Kšœ+œœ˜9Kšœ,˜,K˜—šœ˜Kšœœœ˜(Kšœ ˜ —Kšœœ˜—Kšœœ@œœ˜QKšœœ%œœ˜6Kšœœ&œœ˜7Kš œœœŸœ˜