CDExtras.mesa  (part of Chipndale)
Copyright © 1983, 1984 by Xerox Corporation.  All rights reserved.
by Ch. Jacobi, October 24, 1983 11:48 am
last edited by Ch. Jacobi, November 5, 1984 10:13:32 am PST
 
CDExtras: 
CEDAR 
DEFINITIONS =
BEGIN 
CreateDummyObject: 
PROC[design: 
CD.Design] 
RETURNS [
CD.ObPtr];
--create a dummy cell object which contains the whole design.
--On future changes of the design, the dummy object may or may not
--get obsolete.
--the cell object is NOT put into any cell library
 
EnumerateChildrenObjects: 
PROC [me: 
CD.ObPtr, p: CDDirectory.EnumerateObjectsProc, x: 
REF];
--enumerate me and its children objects
 
EnumerateDesignObjects: PROC [design: CD.Design, p: CDDirectory.EnumerateObjectsProc, x: REF];
BoundingBox: PROC [design: CD.Design] RETURNS [CD.DesignRect];
PushedCellName: PROC [design: CD.Design] RETURNS [Rope.ROPE];
RemoveProperties: 
PROC [design: 
CD.Design, key: 
REF];
--tries to remove the propertiy "key" from all objects of "design";
--may be delayed or incomplete
--(only from objects, not applications...)
 
ToLambda: PROC [n: CD.Number] RETURNS [Rope.ROPE];
PopToTopLevel: 
PROC [design: 
CD.Design]
;
--if "design" is pushed in, it will be popped out, either by flushing, 
--replacing cells or creating new cells
 
Cellize: 
PROC [design: 
CD.Design, name: Rope.
ROPE←
NIL] 
RETURNS [cell: 
CD.ObPtr←
NIL, pos: 
CD.DesignPosition];
--makes a single "cell" of of the "design", removes all applications; 
--pos: if "cell" is included at position "pos" in an empty design we would get "design" again
--if "design" is pushed in, it will be popped out, either by flushing, 
--replacing cells or creating new cells
 
MergeIn: 
PROC [design: 
CD.Design, from: 
CD.Design, name: Rope.
ROPE←
NIL, fullDirectory: 
BOOL←
TRUE] 
RETURNS [ob: 
CD.ObPtr, pos: 
CD.DesignPosition];
--"from" is transfered to an object, and is included (transitive) to "design"'s directory
--"from" then may be resetted (preserving the rule: any object is in at most one directory)
--the caller is assumed to have the locks of both designs
--if "from" is pushed in, it's merged copy will be popped out, either by flushing, 
--replacing or creating new cells
--"name" replaces "from"'s design name for the new created object, but it is a hint only
--"pos": if "ob" is included at position "pos" in an empty design we would get "from" again
--"fullDirectory": whether all objects of "from"'s directory are merged to design,
--or only those used by "from"'s top level
--the "from"'s object's may change name to avoid conflicts with "design"'s directory
--ob gets nil if "from" is empty
--technologies must be compatible
 
MergeInObjects: 
PROC [design: 
CD.Design, from: 
CD.Design, objects: 
LIST 
OF 
CD.ObPtr];
--"objects" which are in "from"'s directory are transferrerd (transitive) to "design"'s directory
--"from" then may be resetted (preserving the rule: any object is in at most one directory)
--the caller is assumed to have the locks of both designs
--the object's may change name to avoid conflicts with "design"'s directory
--technologies must be compatible
 
END.