CD.mesa; Main definitions for ChipNDale, a VLSI design editor
Copyright © 1983, 1986 by Xerox Corporation. All rights reserved.
by Ch. Jacobi, June 24, 1983 3:54 pm
last edited Christian Jacobi, March 25, 1986 1:09:12 pm PST
DIRECTORY
D2Basic USING [Number, Pos, Rect],
Imager USING [Color, Context],
PropertyLists USING [PropList],
Rope USING [ROPE];
CD: CEDAR DEFINITIONS =
-- CD: ChipNDale, a VLSI design editor and data base
BEGIN
-- measures
-- independent of coordinate system
Number: TYPE = D2Basic.Number;
Position: TYPE = D2Basic.Pos;
-- 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 a special comment denies.
--Rect's are closed: they include all the endpoints; as you expect, points have
--size 0; except if a special comment denies.
Orientation: TYPE = [0..7] ← 0;
-- Module CDOrient exports all you probably need about Orientations;
-- If your program depends on the representation of Orientation, it
-- is probably wrong.
original: Orientation = 0;
-- Errors
Error: ERROR [ec: ErrorCode ← programmingError, explanation: Rope.ROPENIL];
ErrorCode: TYPE = {programmingError, callingError, noResource, doubleRegistration, missingRegistration, other};
-- properties
PropList: TYPE = PropertyLists.PropList;
--Friendly use expected: don't assign properties without first register
--their names with CDProperties.
--Use only CDProperties to modify ChipNDale PropList; NOT PropertyLists
PropRef: TYPE = REF PropList ← ; --ABSOLUTELY NEVER NIL
InitPropRef: PROC [] RETURNS [PropRef] = INLINE {
RETURN [NEW[PropList←NIL]]
};
-- Layers
layerNum: NAT = 256;
Layer: TYPE = [0..layerNum);
undefLayer: Layer = 0; -- layer 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];
-- may raise Error[noResource] and others
-- the technolgy implementation must guarantee for uniqueness of uniqueKey's
-- (unique only for the technology)
FetchLayer: PROC [t: Technology, uniqueKey: ATOM] RETURNS [Layer];
LayerTechnology: PROC [l: Layer] RETURNS [Technology];
LayerKey: PROC [l: Layer] RETURNS [ATOM];
--object, cells, instances
markNum: NAT = 256;
Object: TYPE = REF ObjectRep;
--Objects are the main things in ChipNDale
--Objects must draw the same way independant of their environment
ObjectRep: TYPE = RECORD [
class: ObjectClass, -- never modify class nor class^
size: Position ← [2, 2], -- maximal size drawn, not influence...
layer: Layer ← undefLayer,
marked: [0..markNum) ← 0, --only usefull for objects in the design's directory
specificRef: REF ANYNIL,
properties: PropList ← NIL -- see warning
];
-- Several instances may point to same object: consider on modifications.
-- Some implementors of object-classes share the bits of different ObjectRep's
-- (therefore usage of properties of Objects not in the directory is restricted to
-- the object class implentor.)
CellPtr: TYPE = REF CellRep;
CellRep: TYPE = RECORD [
contents: InstanceList ← NIL,
ir: Rect ← [0, 0, -1, -1], --actual interest rect
origin: Position ← [0, 0], --(for cells:) position where client may think the origin is
name: Rope.ROPENIL, --once included directory, use only CDDirectory to change name
simplifyOn: REALLAST[NAT], --a treshold for simplification on quickdraw
dIr: Rect ← [0, 0, -1, -1], --default value for interest rect
drawBorder: BOOLFALSE,--border should be drawn
useDIr: BOOLTRUE--whether the default is used for interest rect
];
RectPtr: TYPE = REF RectRep;
RectRep: TYPE = RECORD [filler: PRIVATE REF];
InstanceList: TYPE = LIST OF Instance←NIL;
Instance: TYPE = REF InstanceRep;
InstanceRep: TYPE = RECORD [
ob: Object,
location: Position ← [0, 0], --in cd-coords
orientation: Orientation ← 0,
selected: BOOLFALSE,
reserved: BOOLFALSE,
properties: PropList ← NIL
];
ObjectClass: TYPE = REF ObjectClassRec;
ObjectClassRec: TYPE = RECORD [ -- generic procedures for an object
quickDrawMe: DrawProc ← NIL,
drawMe: DrawProc ← NIL,
showMeSelected: DrawProc ← NIL,
hitInside: HitInsideProc ← NIL,
interestRect: RectProc ← NIL,
technology: Technology ← NIL, -- NIL on technology independent stuff
objectType: ATOM NIL,
inDirectory: BOOL FALSE,
if inDirectory then objects of this class must be included in designs directory;
if ~inDirectory then objects of this class must be immutable;
-- object classes of objects which have children must have inDirectory=TRUE
directoryProcs: REFNIL,
wireTyped: BOOLFALSE, -- if wireTyped then insideRect.y corresponds to the length
symbolic: BOOLFALSE,
reserved: BOOLFALSE, --reserved for test of future features
internalWrite: InternalWriteProc ← NIL,
internalRead: InternalReadProc ← NIL,
description: Rope.ROPENIL,
describe: DescribeProc ← NIL,
describeInst: DescribeInstProc ← NIL,
origin: PosProc ← NIL,
parent: ObjectClass ← NIL,
properties: PropRef ← NIL
];
DrawProc: TYPE = PROC [inst: Instance, pos: Position, orient: Orientation, pr: REF DrawInformation];
--proc ignores inst.location and inst.orientation, may use inst.properties
HitInsideProc: TYPE = PROC [ob: Object, hitRect: Rect] RETURNS [BOOL];
PosProc: TYPE = PROC [ob: Object] RETURNS [Position];
RectProc: TYPE = PROC [ob: Object] RETURNS [Rect];
BoolProc: TYPE = PROC [ob: Object] RETURNS [BOOL];
InternalWriteProc: TYPE = PROC [me: Object];
InternalReadProc: TYPE = PROC [] RETURNS [Object];
DescribeProc: TYPE = PROC [me: Object] RETURNS [Rope.ROPE];
DescribeInstProc: TYPE = PROC [ap: Instance] RETURNS [Rope.ROPE];
DrawContextProc: TYPE = PROC [pr: DrawRef, proc: DrawContextLayerProc, ob: Object, pos: Position, orient: Orientation, layer: Layer];
--object class which uses a DrawContextProc must guarantee
-- ob#NIL
-- ob.size < [NAT.LAST, NAT.LAST]
DrawContextLayerProc: TYPE = PROC [context: Imager.Context, ob: Object, layer: Layer];
RegisterObjectClass: PROC [objectType: ATOM, class: ObjectClassRec] RETURNS [ObjectClass];
--objectType field must be initialized
--may raise Error[doubleRegistration] and others
--Also initializes procedures with default values
--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
FetchObjectClass: PROC [objectType: REF, technology: Technology←NIL] RETURNS [--readonly-- ObjectClass];
--NIL if not found
--consider ObjectClass as readonly if you are not the implementor of the object type
-- Design
PushRec: TYPE = RECORD [
dummyCell: Instance,
originally a copy of mightReplace; but size may be wrong
mightReplace: Instance←NIL,
specific: CellPtr, -- cache of dummyCell.ob.specificRef
changed: BOOLFALSE,
indirectlyChanged: BOOLFALSE,
deletedList: REFNIL
];
Design: TYPE = REF DesignRec;
DesignRec: TYPE = RECORD [
-- use only CDOps.CreateDesign to create record
-- CDValue or CDProperties for more fields
actual: LIST OF PushRec,
-- actual.first is most deeply pushed cell;
-- pushed cells are copied; the copy is not included in the directory
name: Rope.ROPE NIL,
technology: Technology ← NIL,
properties: PropRef ← ,
cdDirectoryPriv: PRIVATE REF, --field owned by CDDirectoryImpl
cdValuePriv: PRIVATE PrivateValueDRef ← NIL,
cdSequencerPriv: PRIVATE PrivateSequencerDRef,
cdDrawQueuePriv: PRIVATE REFNIL,
cdOpsPriv: PRIVATE REFNIL,
reserved: PRIVATE REFNIL
--CDValue supports more fields
];
PrivateSequencerDRef: TYPE = REF PrivateSequencerDRep;
PrivateSequencerDRep: TYPE;
PrivateValueDRef: TYPE = REF PrivateValueDRep;
PrivateValueDRep: TYPE;
-- Technology
Technology: TYPE = REF TechnologyRep;
TechnologyRep: TYPE = RECORD [
-- use RegisterTechnology to create record
-- all fields except properties read only
-- CDValue or CDProperties for more fields
key: ATOM NIL,
name: Rope.ROPE NIL,
lambda: CD.Number ← 2,
usedLayers: LIST OF Layer, --only technology dependant Layers
properties: PropRef ← ,
cdPriv: PRIVATE PrivateTRef,
cdValuePriv: PRIVATE PrivateValueTRef,
cdSequencerPriv: PRIVATE PrivateSequencerTRef
];
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.ROPE NIL, 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
DrawRef: TYPE = REF DrawInformation;
DrawInformation: TYPE = RECORD [
interestClip: Rect ← [Number.FIRST, Number.FIRST, Number.LAST, Number.LAST],
-- (interrest area; not device area), in doubt is larger;
drawChild: DrawProc ← NIL,
drawRect: DrawRectProc ← NIL, -- design coordinates
stopFlag: REF BOOL ← NIL,
drawOutLine: DrawRectProc ← NIL, -- visualization only; not for generating masks
drawContext: DrawContextProc ← NIL,
drawComment: DrawCommentProc ← NIL, -- visualization only; not for generating masks
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
specialFonts: 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: REF ← NIL, -- 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,
properties: PropRef ← NIL
];
-- use CreateDrawRef for creation unless all fields are set.
ViewerPrivate: TYPE = REF ViewerPrivateRep;
ViewerPrivateRep: TYPE;
DrawRectProc: TYPE = PROC [r: Rect, l: Layer, pr: DrawRef];
DrawCommentProc: TYPE = PROC [r: Rect, comment: Rope.ROPE, pr: DrawRef];
SetGroundProc: TYPE = PROC [pr: DrawRef, pushedOut: BOOL];
CheckPriorityProc: TYPE = PROC [pr: DrawRef];
ContextFilter: TYPE = PACKED ARRAY Layer OF BOOLALL[FALSE];
--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];
-- and assigns usefull default procedures and values.
--vanilla procedures
InterestRect: PROC [ob: Object] RETURNS [r: Rect] = INLINE {
-- Returns the interest rect in objects internal cd coords
RETURN [ob.class.interestRect[ob]]
};
InterestSize: PROC [ob: Object] RETURNS [sz: Position] = INLINE {
-- Returns the size of the interest rect
r: CD.Rect = ob.class.interestRect[ob];
RETURN [[r.x2-r.x1, r.y2-r.y1]];
};
ClientOrigin: PROC [ob: Object] RETURNS [pos: Position] = INLINE {
-- Returns the position of the client's object origin in objects internal cd coords
RETURN [ob.class.origin[ob]]
};
END.