CoreProperties.mesa 
Copyright © 1985 by Xerox Corporation. All rights reversed.
Barth, October 2, 1985 11:30:37 am PDT
Spreitzer, August 12, 1985 6:05:07 pm PDT
Bertrand Serlet October 2, 1985 12:08:17 pm PDT
DIRECTORY Core, CoreRecord;
CoreProperties: CEDAR DEFINITIONS = BEGIN OPEN Core;
Theory
This interface deals with properties.
Operations
GetProp: PROC [from: Properties, prop: ATOM] RETURNS [value: REF ANYNIL];
If value is NIL then no such property.
PutProp: PROC [on: Properties, prop: ATOM, value: REF ANYNIL] RETURNS [new: Properties];
If value is NIL then the property is deleted.
CopyProps: PROC [propList: Properties] RETURNS [copy: Properties];
Uses the property-property propCopy to copy each item.
AppendProps: PROC [winner, loser: Properties] RETURNS [copy: Properties];
Uses the property-property propCopy to copy each item.
Enumerate: PROC [props: Properties, consume: PROC [prop: ATOM, val: REF ANYNIL]];
PrintProperties: PROC [props: Properties, out: STREAM, depth: NAT ← 0];
Uses the property-property propPrettyPrint to print each item.
Registration
RegisterProperty: PROC [prop: ATOM, properties: Properties ← NIL] RETURNS [sameProp: ATOM];
Should be called by every tool which uses a property. Sets the properties proterties as given in the second argument. Returns the argument so that definition and registration can occur in the same line of Cedar code.
StoreProperties: PROC [prop: ATOM, properties: Properties];
To store properties on properties.
FetchProperties: PROC [prop: ATOM] RETURNS [properties: Properties];
To fetch properties on properties.
propPrettyPrint, propRead, propWrite, propCopy, propCompare: ATOM;
Values should be REFs to procs of the appropriate TYPEs.
No PropCompareProc means pointer comparison.
No PropCopyProc means don't copy the property.
No PropWriteProc means don't write the property.
No PropReadProc means make an ERROR.
No PropPrettyPrintProc means it pretty prints as property atom only.
PropDontPrint: PROC[prop: ATOM]; -- causes nothing to be printed
PropCompareProc: TYPE = PROC [prop: ATOM, value1, value2: REF ANY] RETURNS [equal: BOOLFALSE];
PropCopyProc: TYPE = PROC [prop: ATOM, value: REF ANY] RETURNS [valCopy: REF ANY];
If valCopy is NIL then don't copy.
PropWriteProc: TYPE = PROC [out: STREAM, val: REF ANY];
PropReadProc: TYPE = PROC [in: STREAM] RETURNS [val: REF ANY];
PropPrettyPrintProc: TYPE = PROC [to: STREAM, prop: ATOM, val: REF ANY, depth: NAT];
PropDoCopy: REF PropCopyProc; -- Copy of val; trivial procedure; for some types it is a default
PropRopeCompare: PropCompareProc;
PropIntCompare: PropCompareProc;
PropRopeWrite: PropWriteProc;
PropAtomWrite: PropWriteProc;
PropIntWrite: PropWriteProc;
PropRopeRead: PropReadProc;
PropAtomRead: PropReadProc;
PropIntRead: PropReadProc;
Short Cuts
PropertyLiteral: TYPE = RECORD [key: ATOM, val: REF ANYNIL];
Props: PROC [lit1, lit2, lit3, lit4, lit5, lit6: PropertyLiteral ← []] RETURNS [properties: Properties];
GetDesignProp: PROC [from: Design, prop: ATOM] RETURNS [value: REF ANYNIL];
PutDesignProp: PROC [on: Design, prop: ATOM, value: REF ANYNIL];
GetWireProp: PROC [from: Wire, prop: ATOM] RETURNS [value: REF ANYNIL];
PutWireProp: PROC [on: Wire, prop: ATOM, value: REF ANYNIL];
GetCellTypeProp: PROC [from: CellType, prop: ATOM] RETURNS [value: REF ANYNIL];
PutCellTypeProp: PROC [on: CellType, prop: ATOM, value: REF ANYNIL];
GetCellInstanceProp: PROC [from: CoreRecord.CellInstance, prop: ATOM] RETURNS [value: REF ANYNIL];
PutCellInstanceProp: PROC [on: CoreRecord.CellInstance, prop: ATOM, value: REF ANYNIL];
END.