DIRECTORY AbSets, BiRels, LichenDataOps, LichenIntBasics, LichenDataStructure, Rope, SetBasics; LichenChecking: CEDAR PROGRAM IMPORTS AbSets, BiRels, LichenDataStructure, SetBasics = BEGIN OPEN LichenDataOps, LichenDataStructure, Sets:AbSets; CheckDesign: PUBLIC PROC [d: Design] = { CheckSubscript: PROC [pw, kidsa: REF ANY] ~ { class: PWClass ~ ClassOfPart[pw]; cct: CellType ~ NARROW[d.cct[class].ApplyA[pw].MA]; kids: Seq--of PW-- ~ BiRels.DeRef[kidsa]; CheckKid: PROC [index: INT, kid: PW] ~ { IF class # ClassOfPart[kid] THEN Error["Broken"]; IF d.cct[class].ApplyA[kid].MA # cct THEN Error["Broken"]; IF NOT d.parent.HasAA[kid, pw] THEN Error["Broken"]; RETURN}; kids.EnumIA[CheckKid]; RETURN}; PerCellType: PROC [ra: REF ANY] = { ct: CellType ~ NARROW[ra]; IF ct.d # d THEN Error["Broken"]; CheckCellType[ct]; }; d.cellTypes.EnumA[PerCellType]; RETURN}; CheckCellType: PUBLIC PROC [ct: CellType] = { d: Design ~ ct.d; IF NOT d.cellTypes.HasMemA[ct] THEN Error["Broken"]; IF (ct.asArray#NIL) # d.arrayElt.HasMapA[ct] THEN Error["Broken"]; IF ct.asu # NIL THEN { CheckSubcell: PROC [ra: REF ANY] ~ { ci: CellInstance ~ NARROW[ra]; ict: CellType ~ d.CiT[ci]; typePorts: Set ~ ict.CTParts[p]; atomics: Set ~ typePorts.Intersection[d.isAtomic]; IF NOT atomics.Difference[ci.conns.SetOn[left]].Empty THEN Error["Broken"]; RETURN}; ct.Subcells.EnumA[CheckSubcell]; }; RETURN}; END. ZLichenChecking.Mesa Last tweaked by Mike Spreitzer on March 9, 1988 7:36:32 am PST Κ#– "cedar" style˜code™K™>—K˜KšΟk œV˜_K˜šΡbnxœœ˜Kšœ/˜6Kšœ˜—K˜Kšœœ%Οnœ˜;K˜šŸ œœœ˜(šŸœœ œœ˜-K˜!Kšœœœ˜3Kšœ Οc œ˜)šŸœœ œœ˜(Kšœœ˜1Kšœœœ˜:Kšœœœ˜4Kšœ˜—K˜Kšœ˜—šŸ œœœœ˜#Kšœœ˜Kšœ œ˜!Kšœ˜K˜—Kšœ˜Kšœ˜—K˜šŸ œœœ˜-K˜Kšœœœ˜4Kšœ œœ˜Bšœ œœ˜šŸ œœœœ˜$Kšœœ˜Kšœ˜Kšœ ˜ Kšœ2˜2Kšœœ0œ˜KKšœ˜—Kšœ ˜ K˜—Kšœ˜—K˜Kšœ˜—…—nλ