DIRECTORY AbSets, LichenDataStructure, BiRels; LichenStructuring: CEDAR DEFINITIONS IMPORTS AbSets, BiRels = BEGIN OPEN LichenDataStructure, Sets:AbSets; Set: TYPE ~ LichenDataStructure.Set; BiRel: TYPE ~ LichenDataStructure.BiRel; Function: TYPE ~ LichenDataStructure.Function; OneToOne: TYPE ~ LichenDataStructure.OneToOne; Seq: TYPE ~ LichenDataStructure.Seq; Thing: TYPE ~ REF ANY --actually UNION [Port, Wire]--; StepTriple: TYPE ~ RECORD [parent: StepNode, step: NameStep, child: StepNode]; StepDAG: TYPE ~ REF StepDAGPrivate; StepDAGPrivate: TYPE ~ RECORD [ down: Function--parent StepNode _ Decomp--, up: OneToOne--child stepNode f Ups--, toThing: Function--StepNode _ Thing, exclusive of root--, cands: Set--domain of candSize--, rootThing: Thing, rootNode: StepNode, prefixd, leavesCommonized: BOOL _ FALSE ]; Decomp: TYPE ~ REF Function--NameStep _ child StepNode--; Ups: TYPE ~ REF BiRel--parent StepNode X NameStep--; StepNode: TYPE ~ REF INT; StepTree: TYPE ~ StepNode; CandGrade: TYPE ~ RECORD [ good: BOOL, size: INT ]; CreateDAG: PROC [root: REF ANY--UNION[Thing, StepNode]--, from: StepDAG] RETURNS [dag: StepDAG]; VerifyDAG: PROC [dag: StepDAG]; InsertInDAG: PROC [dag: StepDAG, parent: StepNode, parts: SteppyName, thing: Thing]; AddLink: PROC [dag: StepDAG, parent: StepNode, step: NameStep, child: StepNode]; GetDown: PROC [dag: StepDAG, parent: StepNode, step: NameStep, mayAdd: BOOL] RETURNS [child: StepNode]; GetDecomp: PROC [dag: StepDAG, parent: StepNode, mayAdd: BOOL] RETURNS [dec: Decomp]; GetUps: PROC [dag: StepDAG, child: StepNode, mayAdd: BOOL] RETURNS [ups: Ups]; RemoveLink: PROC [dag: StepDAG, parent: StepNode, step: NameStep, child: StepNode, cleanup: CleanUpOption]; CleanUpOption: TYPE ~ {ignore, wontBeNeeded, ifNotThinged, do}; ReplaceNode: PROC [dag: StepDAG, doomed, survivor: StepNode, cleanDown: CleanDownOption]; CleanDownOption: TYPE ~ {unlink, keep, none}; RemoveLeaf: PROC [dag: StepDAG, leaf: StepNode]; PruneCand: PROC [dag: StepDAG, cand: StepNode]; Sequify: PROC [oto: OneToOne] RETURNS [seq: Seq]; GradeCand: PROC [dag: StepDAG, cand: StepNode] RETURNS [grade: CandGrade]; CommonizeLeaves: PROC [dag: StepDAG]; CommonizeDecomps: PROC [dag: StepDAG]; CreateTreeSpace: PROC [dag: StepDAG] RETURNS [treeSpace: Sets.Space]; IsKidCand: PROC [dag: StepDAG, node: StepNode] RETURNS [BOOL] ~ INLINE { IF dag.cands.HasMemA[node] THEN RETURN [TRUE]; IF dag.down.HasMapA[node] THEN RETURN [FALSE]; IF NOT dag.prefixd THEN ERROR--can't check yet--; IF NOT dag.toThing.HasMapA[node] THEN ERROR--node not in this dag--; RETURN [TRUE]}; END. .LichenStructuring.Mesa Last tweaked by Mike Spreitzer on January 28, 1988 1:20:10 pm PST These are just placeholders. Every leaf node always has a Thing; once the prefix property is established, only leaves have Things. Once the leaves are `commonized', each Thing is had by exactly one leaf. Κ– "cedar" style˜code™KšœA™A—K˜KšΟk œ%˜.K˜šΟnœœ ˜$Kšœ˜Kšœ˜—Kš˜K˜Kšœžœ˜&K˜Kšœœ˜$Kšœœ˜(Kšœ œ ˜.Kšœ œ ˜.Kšœœ˜$K˜Kš œœœœΟcœ˜6K˜Kšœ œœ5˜NK˜Kšœ œœ˜#šœœœ˜KšœŸΠcmŸ œ˜+Kšœ Ÿ Ÿœ˜%KšœŸ  Ÿœ˜9Kšœ Ÿœ˜!K˜K˜Kšœœ˜'K˜—K˜Kš œœœ Ÿ  Ÿœ˜9Kš œœœŸ Ÿ œ˜4šœ œœœ˜K™Ν—K˜Kšœ œ ˜K˜šœ œœ˜Kšœœ˜ Kšœ˜ Kšœ˜—K˜Kš ž œœœŸœœ˜`Kšž œœ˜K˜Kšž œœC˜TKšžœœC˜PKšžœœ:œœ˜gKšž œœ*œœ˜UKšžœœ)œœ ˜Nšž œœ[˜kKšœœ,˜?—šž œœH˜YKšœœ˜-—Kšž œœ ˜0Kšž œœ ˜/Kšžœœœ ˜1Kšž œœ œ˜JKšžœœ˜%Kšžœœ˜&K˜Kšžœœœ˜EK˜š ž œœ œœœ˜HKšœœœœ˜.Kšœœœœ˜.Kš œœ œŸœ˜1Kš œœœŸœ˜DKšœœ˜—K˜Kšœ˜—…— (ζ