CD.mesa
Copyright © 1983, 1984, 1985, 1986, 1987 by Xerox Corporation. All rights reserved.
Created by: Christian Jacobi, June 24, 1983 3:54 pm
Last edited by: Christian Jacobi, March 30, 1987 11:22:22 am PST
Main definitions for ChipNDale, a VLSI design editor and database.
DIRECTORY
D2Basic USING [Number, Rect, Vector],
D2Orient USING [Orientation, Transformation],
Imager USING [Color, Context],
Properties USING [PropList],
RefTab USING [Ref],
Rope USING [ROPE],
SymTab USING [Ref],
TokenIO USING [Handle];
CD: CEDAR DEFINITIONS =
BEGIN
-- Measuring
Number: TYPE = D2Basic.Number;
Position: TYPE = D2Basic.Vector;
-- RECORD [x, y: Number];
Rect: TYPE = D2Basic.Rect;
-- RECORD [x1, y1, x2, y2: Number];
-- A Rect is called normalized if (x1>x2) OR (y1>y2) means that the Rect is empty.
-- Rects are normalized, except if an explicite comment denies.
-- Rect's are closed: they include all the endpoints; as you expect, points have
-- size 0.
Orientation: TYPE = D2Orient.Orientation;
-- MACHINE DEPENDENT {original(0), mirrorX(1), rotate90(2), rotate90X(3),
-- rotate180(4), rotate180X(5), rotate270(6), rotate270X(7)};
-- An orientation represents an anticlockwise rotation maybe followed by a reflection in x.
-- [Reflection in x means: modify x coordinates, leave y coordinates]
mirrorY: Orientation = rotate180X;
Transformation: TYPE = D2Orient.Transformation;
-- RECORD [off: D2Basic.Vector ← [0, 0], orient: Orientation ← original];
-- A transformation represents an orientation followed by a translation.
-- Errors
Error: ERROR [ec: ErrorCode ← programming, explanation: Rope.ROPENIL];
ErrorCode: TYPE = {programming, calling, noResource, doubleRegistration, missingRegistration, directoryInvariant, objectMutability, designMutability, classBehaviour, other};
-- Properties
PropList: TYPE = Properties.PropList;
-- Friendly use expected: don't assign properties without first registering their names
-- with CDProperties.
-- Use only CDProperties to modify ChipNDale PropList; never Properties directly
-- to avoid problems with unmonitored concurrency.
PropRef: TYPE = REF PropList ← ; --ABSOLUTELY NEVER NIL
InitPropRef: PROC [] RETURNS [PropRef] = INLINE {
-- Initialization for variables of type PropRef
RETURN [NEW[PropList←NIL]]
};
-- Layers
layerNum: NAT = 256;
Layer: TYPE = [0..layerNum);
undefLayer: Layer = 0; -- Used for object containing different or unknown Layers
shadeLayer: Layer = 1; -- Visualization; not for generating masks
errorLayer: Layer = 2; -- Real layer reserved for error messages; rarely for generating masks
backgroundLayer: Layer = 3; -- Special pushed-in backGround; not for generating masks
outlineLayer: Layer = 4; -- Special color for outline; not for generating masks
selectionLayer: Layer = 5;-- Special color for selection; not for generating masks
commentLayer: Layer = 6;-- Real layer; may or may not be used by technologies
NewLayer: PROC [technology: Technology, uniqueKey: ATOM] RETURNS [Layer];
-- Creates a new layer for technology
-- May raise Error[noResource]
-- The technolgy implementation must guarantee for uniqueness of uniqueKey's
-- (unique only inside the technology)
FetchLayer: PROC [t: Technology, uniqueKey: ATOM] RETURNS [Layer];
-- Returns a layer given a technology and an unique layer key
-- May also return technology independent layers
LayerTechnology: PROC [l: Layer] RETURNS [Technology];
-- Returns the technology of the layer, or, NIL if layer is technology independent
LayerKey: PROC [l: Layer] RETURNS [ATOM];
-- Returns the technology specific unique key of the layer
--Object, cells, instances
Object: TYPE = REF ObjectRep;
-- Objects are the main things in ChipNDale
-- Objects must draw the same way independant of their environment
-- Several different instances may use the same object!
ObjectRep: TYPE = RECORD [--read-only except for class implementor
class: ObjectClass, 
-- Clients: never modify class nor class^
-- Be aware: Asynchrounous redrawing may be in progress
bbox: Rect ← [0, 0, 2, 2], 
-- Maximal area drawn in DrawProcs, not electrical influence.
-- Used for all graphical pruning purposes.
layer: Layer ← undefLayer,
immutable: BOOLFALSE,
-- Readonly, even to object class!
-- immutable being false does not mean the object can be changed: an object can be
-- changed only if it is mutable, and, it is accessed in a way which allows changes.
-- An immutable object must not have any mutable children.
-- Once immutable, an object can not be made mutable again; but if read from a file,
-- the new copy probably will be mutable.
showErrors: BOOLFALSE,
-- Owned by the error displaying module, not the class!
reservedO: BOOLFALSE, 
-- Owned by ChipNDale's implementation [experimental]
specific: REF ANYNIL,
-- Owned by object class
properties: PropList ← NIL
-- Usage of properties of immutable Objects is restricted to object class implentors or
-- users which provide unique property keys.
];
InstanceSequence: TYPE = REF InstanceSequenceRep;
InstanceSequenceRep: TYPE = RECORD [length: NAT𡤀, elts: SEQUENCE size: NAT OF CD.Instance];
CellSpecific: TYPE = REF CellRep;
CellRep: TYPE = RECORD [
contents: InstanceList ← NIL, 
-- Used for extras/large/pushed-in cells
sequence: InstanceSequence ← NIL, 
-- Reduces memory access compared to list
ir: Rect ← [0, 0, -1, -1], 
-- Interest rect
simplifyOn: REALLAST[NAT], 
-- A treshold for simplification on quickdraw
drawBorder: BOOLFALSE, 
-- Border should be drawn
changed: BOOLFALSE,  
-- Cell changed since push [not IO]
specifiedIr: BOOLFALSE, 
-- Interest rect is explicitelly specified [not defaulted]
dummyCell: --READONLY-- BOOLFALSE,
-- Used in push stack of a design
-- If set, inhibits use of sequence, assures mutable
reserved1: BOOLFALSE,  -- for experiments
reserved2: BOOLFALSE-- for experiments
];
RectSpecific: TYPE = REF RectRep;
RectRep: TYPE = RECORD [filler: PRIVATE REF];
InstanceList: TYPE = LIST OF Instance ← NIL;
Instance: TYPE = REF InstanceRep;
InstanceRep: TYPE = RECORD [
ob: Object,
trans: Transformation ← [],
selected: BOOLFALSE,  
-- Meaningfull for instances of pushed in cells only
reservedI: BOOLFALSE, -- for experiments
properties: PropList ← NIL
];
ObjectClass: TYPE = REF ObjectClassRec;
ObjectClassRec: TYPE = RECORD [ -- generic class procedures for an object
quickDrawMe: DrawProc ← NIL,  
-- An optimized draw procedure for viewers.
drawMe: DrawProc ← NIL,  
-- Drawing the object into an abstract device.
-- Children objects returned by drawMe must never be muted unless mutability
-- is guaranteed using other means [immuable bit is NOT sufficient].
-- The draw procs defines the truth.
showMeSelected: DrawProc ← NIL, 
-- Showing the selection [for top level only].
hitInside: HitInsideProc ← NIL,  
-- For fine grain selection.
interestRect: RectProc ← NIL, 
-- The boundary the designer likes to think about.
-- The objects bounding box includes the interestRect.
technology: Technology ← NIL, 
-- Or NIL for technology independent classes
objectType: ATOMNIL,  
-- registration key
composed: BOOLFALSE,   
-- Objects which have children must be composed !
-- Only composed classes can have mutable objects; if class is not composed
-- objects are supposed immutable.
-- Composed classes have more invariants and class procedures in CDDirectory.
directoryProcs: REFNIL,
-- More class procedures for composed classes
-- Field reserved for CDDirectory
wireTyped: BOOLFALSE,  
-- Allows ChipNDale to stretch object in a certain way
-- If wireTyped then [interestRect] y corresponds to the length
atomicOb: BOOLFALSE, 
-- Creation using CDAtomicObjects class.
-- A particular subset of non composed classes.
symbolic: BOOLFALSE,  
-- Object used for interface specification; no mask
xDesign: BOOLFALSE,  
-- Class allows children of composed classes across designs
supressTruth: BOOLFALSE, 
-- Dont write objects of this class to permanent files in truth mode [expand object]
showsErrors: BOOLFALSE, 
-- Tells whether drawMe's deal with error messages.
-- Set by class, read by error message handling package.
reservedC: BOOLFALSE, 
-- For experiments of ChipNDale itself
describesSignal: BOOLFALSE, 
-- Hint that describe tells already about the SignalName
description: Rope.ROPENIL, 
-- Shortcut for NIL describe procs
describe: DescribeProc ← NIL,
-- Describes object, but description does not need to include name 
newLayer: ChangeLayerProc ← NIL, 
-- Used by some simple non-composed classes only
internalWrite: InternalWriteProc ← NIL,
internalRead: InternalReadProc ← NIL,
parent: ObjectClass ← NIL, 
-- For subclassing purposes
properties: PropRef ← NIL
-- Used by ChipNDale, class, and clients
];
DrawProc: TYPE = PROC [pr: CD.DrawRef, ob: CD.Object, trans: CD.Transformation←[], readOnlyInstProps: CD.PropList←NIL];
HitInsideProc: TYPE = PROC [ob: CD.Object, hitRect: CD.Rect] RETURNS [BOOL];
RectProc: TYPE = PROC [ob: CD.Object] RETURNS [CD.Rect];
InternalWriteProc: TYPE = PROC [h: TokenIO.Handle, ob: CD.Object];
InternalReadProc: TYPE = PROC [h: TokenIO.Handle, key: ATOM] RETURNS [CD.Object];
DescribeProc: TYPE = PROC [ob: CD.Object, readOnlyInstProps: CD.PropList←NIL, verbosity: NAT𡤀] RETURNS [Rope.ROPE];
ChangeLayerProc: TYPE = PROC [inst: CD.Instance, layer: CD.Layer] RETURNS [BOOLTRUE];
DrawContextProc: TYPE = PROC [pr: CD.DrawRef, proc: CD.DrawContextLayerProc, ob: CD.Object, trans: CD.Transformation, layer: CD.Layer];
-- Object classes which uses DrawContextProc must guarantee
-- ob#NIL
-- ob.bbox fits in [-NAT.LAST/2, -NAT.LAST/2, NAT.LAST/2, NAT.LAST/2]
DrawContextLayerProc: TYPE = PROC [context: Imager.Context, ob: CD.Object, layer: CD.Layer];
RegisterObjectClass: PROC [objectType: ATOM, class: ObjectClassRec, inherit: REFNIL] RETURNS [ObjectClass];
-- Registers an object class; initializes procedures with default values.
-- May raise Error[doubleRegistration] and others
-- An object type may be used either in arbitrary technology or technology-independent.
-- This should be the only way to create data of type ObjectProcsRec
-- inherit: objectType ATOM or class; overwrites class.parent
--
-- Think twice before implementing object classes outside the ChipNDale implementation.
-- In general this is not a good idea and will introduce long living data and maintenance
-- problems.
FetchObjectClass: PROC [objectType: REF, technology: Technology←NIL] RETURNS [--readonly-- ObjectClass];
-- Returns registration of object class; NIL if not found
-- Consider ObjectClass as readonly if you are not the implementor of the object class.
-- Design
PushRec: TYPE = RECORD [
dummyCell: Instance,
-- An instance of a cell describing the current state of the pushed in cell.
-- Originally a copy of mightReplace; dummyCell.ob is not included in the directory.
-- Sub instances of cell are mapped to design coordinates.
-- bbox of cell object may be wrong.
mightReplace: Instance ← NIL,
-- The original instance into which the design is pushed in.
-- mightReplace is in the coordinate system of the next outer dummyCell.
-- and is removed from [the next outer dummyCell's] instance list.
-- Sub instances of mightReplace.ob are in cd coordinate system of the object
-- May be NIL for top level
desc: Rope.ROPE,
-- Description of object pushed in
specific: CellSpecific
-- Cache of dummyCell.ob.specific
];
Design: TYPE = REF DesignRec;
DesignRec: TYPE = RECORD [
-- Use only CDOps.CreateDesign to create DesignRec records
-- Use CDValue or CDProperties for more fields
-- Use CDSequencer to synchronize multi treaded access to designs
actual: LIST OF PushRec,
-- Stack of pushed in cells
-- actual.first describes most deeply pushed in object
name: Rope.ROPENIL,  
-- Treat readonly ! [internal invariants]
technology: Technology ← NIL, 
-- treat readonly
properties: PropRef ← ,  
-- Use CDProperties
edited: BOOLFALSE,  
-- Treat readonly ! [internal invariants]
mutability: Mutability ← findOut, 
-- Treat readonly ! Write only by CDSequencer
changedSinceSaving: BOOLFALSE, 
-- Treat readonly ! [internal invariants]
cdDirectory1: PRIVATE SymTab.Ref←NIL,
-- Used by CDDirectory for directory
cdDirectory2: PRIVATE RefTab.Ref←NIL,  
-- Used by CDDirectory for directory
cdDirectoryPriv2: PRIVATE REF,  
-- Used by CDDirectory for ownership keys
cdValuePriv: PRIVATE PrivateValueDRef ← NIL, 
-- Reserved for CDValue
cdSequencerPriv: PRIVATE PrivateSequencerDRef, 
-- Reserved for CDSequencer
cdDrawQueuePriv: PRIVATE REFNIL, 
-- Reserved for CDDrawQueue
delayedRedrawsPriv: PRIVATE REFNIL, 
-- Reserved for single module
unDoBuffers: PropRef ←,  
-- It is ok to use InitPropRef to disable undos
reservedD: PRIVATE REFNIL
-- Reserved for ChipNDale experiments
];
PrivateSequencerDRef: TYPE = REF PrivateSequencerDRep;
PrivateSequencerDRep: TYPE;
PrivateValueDRef: TYPE = REF PrivateValueDRep;
PrivateValueDRep: TYPE;
Mutability: TYPE = {findOut, editable, inaccessible, readonly} ← findOut;
--Mutability, defined to be useful for designs.
-- findOut: mutability not yet defined.
-- editable: design or its objects can be edited, but only if the designs lock is hold.
-- inaccessible: this path inhibits any edits on the design, but does not guarantee
-- that there is no other way som other process performs edits.
-- readonly: No changes in design are made.
--If a design is not editable this does not mean complete immutability:
-- Top level instances may be made for visualization.
-- Objects may but do not need to have the immutable flag.
-- Objects accessed accross design boundaries may change.
-- Technology
Technology: TYPE = REF TechnologyRep;
TechnologyRep: TYPE = RECORD [
-- use RegisterTechnology to create TechnologyRep record
-- all fields except properties read only
-- use CDValue or CDProperties for more fields
key: ATOMNIL,
name: Rope.ROPENIL,
lambda: CD.Number ← ,
usedLayers: LIST OF Layer,
-- List of technology dependent Layers
properties: PropRef ← ,
cdPriv: PRIVATE PrivateTRef,
-- Reserved for CDImpl
cdValuePriv: PRIVATE PrivateValueTRef,  
-- Reserved for CDValue
cdSequencerPriv: PRIVATE PrivateSequencerTRef,
-- Reserved for CDSequencer
reservedCDSimpleRules: PRIVATE REFNIL,
-- Reserved for CDSimpleRules
reservedT: PRIVATE REFNIL
-- Reserved for experiments
];
PrivateSequencerTRef: TYPE = REF PrivateSequencerTRep;
PrivateSequencerTRep: TYPE;
PrivateValueTRef: TYPE = REF PrivateValueTRep;
PrivateValueTRep: TYPE;
PrivateTRef: TYPE = PRIVATE REF PrivateTRep;
PrivateTRep: TYPE;
RegisterTechnology: PROC [key: ATOM, name: Rope.ROPENIL, lambda: CD.Number ← 2] RETURNS [Technology];
-- This must be the only way to create data of type TechnologyRep
-- May raise Error[doubleRegistration] and others
FetchTechnology: PROC [key: ATOM] RETURNS [Technology];
-- NIL if not found
EnumerateTechnologies: PROC [proc: TechnologyEnumerator] RETURNS [quit: BOOL];
TechnologyEnumerator: TYPE = PROC [tech: CD.Technology] RETURNS [quit: BOOLFALSE];
-- Drawing
-- The drawing process involves three actors:
-- The object class provides drawing object specific features.
-- The abstract device provides rendering procedures.
-- ChipNDale itself provides some default procedures and the ground rules
-- how the device and the object class must communicate.
-- The drawing defines the truth of ChipNDale objects.
DrawRef: TYPE = REF DrawInformation;  --this describes an abstract device to draw objects into
DrawInformation: TYPE = RECORD [
interestClip: Rect ← [Number.FIRST/2, Number.FIRST/2, Number.LAST/2, Number.LAST/2],
-- interest area; not device area!
-- might be slightly larger than device area, such that
-- every feature visible in device area can be gotten with pruning to interest area,
-- small enough, such that
-- conversion from cd numbers to device numbers does not cause arithmetic overflow
drawChild: DrawProc ← NIL,  -- drawing and recursing
drawRect: DrawRectProc ← NIL, -- coordinates in cd numbers
stopFlag: REF BOOLNIL, -- setting stopFlag^ to true stops drawing
drawOutLine: DrawRectProc ← NIL, -- visualization only; not for generating masks
drawContext: DrawContextProc ← NIL, -- drawing into an imager context
drawComment: DrawCommentProc ← NIL, -- visualization only; not for generating masks
drawChildSel: DrawProc ← NIL,  -- drawing of selection of child
setGround: SetGroundProc ← NIL,
priorityChecker: CheckPriorityProc ← NIL, --usually no-op
scaleHint: REAL ← 0,  -- to monitor simplifications; 0 means no simplifications
environment: BOOLTRUE, -- draw the outside of pushed in cells
symbolics: BOOLTRUE,  -- draw symbolic objects
selections: BOOLTRUE,  -- draw selections
showErrors: BOOLTRUE, -- draw error messages
fontSubstitution: BOOLFALSE,  -- usually FALSE; device may replace fonts
checkPriority: BOOLFALSE,  -- usually FALSE; priority of running process
borders: BOOLFALSE,  -- visualization only; not for generating masks
b4: BOOLTRUE,  -- reserved for experiments
b5: BOOLTRUE,  -- reserved for experiments
devicePrivate: REFNIL, -- differentiate among multiple (viewers) with same drawProc's
viewerPrivate: ViewerPrivate ← NIL, -- speed up for viewers devicePrivate
deviceContext: Imager.Context ← NIL, -- may or may not be used
contextFilter: REF ContextFilter ← NIL, -- (default uses filter only if deviceContext=NIL)
contextColors: REF ContextColors ← NIL,-- (default uses colors only if deviceContext#NIL)
design: Design ← NIL,  
-- Optional in general, but might be required by some devices.
-- Object classes must not assume that drawn objects are included in this design.
-- Class: Need not be maintained by drawing over design boundaries.
properties: PropRef ← NIL
];
-- use CreateDrawRef for creation of DrawInformation record, unless all fields are set.
ViewerPrivate: TYPE = REF ViewerPrivateRep;
ViewerPrivateRep: TYPE;
DrawRectProc: TYPE = PROC [pr: CD.DrawRef, r: CD.Rect, l: CD.Layer];
DrawCommentProc: TYPE = PROC [pr: CD.DrawRef, r: CD.Rect, comment: Rope.ROPE];
SetGroundProc: TYPE = PROC [pr: CD.DrawRef, pushedOut: BOOL];
CheckPriorityProc: TYPE = PROC [pr: CD.DrawRef];
ContextFilter: TYPE = PACKED ARRAY Layer OF BOOLALL[TRUE];
-- A TRUE entry means the layer is visible
ContextColors: TYPE = ARRAY Layer OF Imager.Color ← ALL[NIL];
-- A NIL color entry means the layer is invisible
CreateDrawRef: PROC [inf: DrawInformation] RETURNS [DrawRef];
-- Creates an abstract device and assigns usefull default procedures and values.
-- Vanilla procedures
Describe: PROC [ob: Object, readOnlyInstProps: PropList←NIL, design: CD.Design←NIL, verbosity: NAT𡤁] RETURNS [Rope.ROPE];
-- Returns description of an object
-- design: Its ok to ommit design for this procedure, but then name can't be included
-- readOnlyInstProps: some object classes need to access instance properties for good description
-- verbosity: degree of detail requested; 0 very short; 1 typical interaction >1 particular interest
DrawOb: PROC [pr: DrawRef, ob: CD.Object, trans: Transformation←[], readOnlyInstProps: PropList←NIL] = INLINE {
-- Calls the draw procedure; This defines the truth about objects!
-- Drawn sub objects may be not accessible without having immuable flag set.
ob.class.drawMe[pr, ob, trans, readOnlyInstProps]
};
InterestRect: PROC [ob: Object] RETURNS [r: Rect] = INLINE {
-- Returns the interest rect of the object.
RETURN [ob.class.interestRect[ob]]
};
InterestBase: PROC [ob: Object] RETURNS [sz: Position] = INLINE {
-- Returns the base of the interest rect.
r: Rect = ob.class.interestRect[ob];
RETURN [[r.x1, r.y1]];
};
InterestSize: PROC [ob: Object] RETURNS [sz: Position] = INLINE {
-- Returns the size of the interest rect.
r: Rect = ob.class.interestRect[ob];
RETURN [[r.x2-r.x1, r.y2-r.y1]];
};
DesignName: PROC [design: Design←NIL] RETURNS [Rope.ROPE];
-- Returns a name for a design [never returns a NIL ROPE].
END.