DIRECTORY CD USING [Design, InterestRect, Object, Position, Rect], Core, CoreCreate USING [PA], CoreGeometry, HashTable USING [Table], Sinix USING [Mode]; PWCore: CEDAR DEFINITIONS IMPORTS CD = BEGIN CellType: TYPE = Core.CellType; Object: TYPE = CD.Object; Wire: TYPE = Core.Wire; WireSeq: TYPE = Core.WireSeq; ROPE: TYPE = Core.ROPE; Properties: TYPE = Core.Properties; Wires: TYPE = Core.Wires; LayoutProc: TYPE = PROC [cellType: CellType] RETURNS [obj: Object]; DecorateProc: TYPE = PROC [cellType: CellType, obj: Object]; AttributesProc: TYPE = PROC [cellType: CellType]; RegisterLayoutAtom: PROC [layoutAtom: ATOM, layoutProc: LayoutProc, decorateProc: DecorateProc _ NIL, attributesProc: AttributesProc _ NIL] RETURNS [sameAtom: ATOM]; GetLayoutAtomRegistration: PROC [layoutAtom: ATOM] RETURNS [layoutProc: LayoutProc _ NIL, decorateProc: DecorateProc _ NIL, attributesProc: AttributesProc _ NIL]; layoutAtomProp: ATOM; -- = $Layout. Property on cellTypes to specifies layoutAtoms GetLayoutAtom: PROC [cellType: CellType] RETURNS [layoutAtom: ATOM _ NIL]; Layout: PROC [cellType: CellType] RETURNS [obj: Object]; InterestRect: PROC [cellType: CellType] RETURNS [ir: CD.Rect] = INLINE {ir _ CD.InterestRect[Layout[cellType]]}; maskSuffix: ROPE; extractMode: Sinix.Mode; SetLayout: PROC [cellType: CellType, layoutAtom: ATOM, userDataProp: ATOM _ NIL, userData: REF _ NIL]; SetGet: PROC [cellType: CellType, source: CD.Design] = INLINE {SetLayout[cellType, $Get, $PWCoreSourceDesign, source]}; SetLayoutAndDecoration: PROC [cellType: CellType, layout: Object] = INLINE {SetLayout[cellType, $ValueNoDecorate, $PWCoreValue, layout]}; SetAbutX: PROC [cellType: CellType] = INLINE {SetLayout[cellType, $RawAbutX]}; SetAbutY: PROC [cellType: CellType] = INLINE {SetLayout[cellType, $RawAbutY]}; SetArrayX: PROC [cellType: CellType] = INLINE {SetLayout[cellType, $ArrayX]}; SetArrayY: PROC [cellType: CellType] = INLINE {SetLayout[cellType, $ArrayY]}; RotateCellType: PROC [rotatedCellType: CellType, orientation: ATOM] RETURNS [cellType: CellType]; SortProc: TYPE = PROC [CD.Position, CD.Position] RETURNS [BOOL]; SortInX: SortProc; SortInY: SortProc; ReverseSortInX: SortProc; ReverseSortInY: SortProc; DecorateValue: DecorateProc; DecorateAbut: PROC [cellType: CellType, obj: Object, sort: SortProc]; DecorateAbutX: DecorateProc; DecorateAbutY: DecorateProc; DecorateReverseAbutX: DecorateProc; DecorateReverseAbutY: DecorateProc; DecorateRecasted: DecorateProc; DecorateRotated: DecorateProc; DecorateFlatten: PROC [cellType: CellType, obj: Object, sort: SortProc]; SortInstances: PROC [decoration: CoreGeometry.Decoration, cellType: CellType, sort: SortProc]; AbutInstance: TYPE = RECORD [object: Object, pas: LIST OF CoreCreate.PA _ NIL]; AbutCell: PROC [public: Wire, abutInstances: LIST OF AbutInstance, inX: BOOL, name: ROPE _ NIL, props: Properties _ NIL] RETURNS [recordCell: CellType]; Store: PROC [cellType: CellType, withCuteFonts: BOOL _ FALSE]; Retrieve: PROC [name: ROPE] RETURNS [cellType: CellType]; layoutClass: Core.CellClass; -- data field of such objects is of type LayoutData LayoutData: PRIVATE TYPE = REF LayoutDataRec; LayoutDataRec: PRIVATE TYPE = RECORD [ obj: Object, -- obj as returned by the layoutProc cellType: CellType, -- source as passed by the user mode: Sinix.Mode -- extractMode, at layout creation time ]; LayoutCellTypeInfo: PROC [layoutCellType: CellType] RETURNS [obj: Object, sourceCellType, extractedCellType: CellType, extractedToSource: HashTable.Table]; CorrespondingCellType: PROC [obj: Object] RETURNS [layoutCellType: CellType _ NIL]; Signal: SIGNAL [cellType: CellType]; Error: ERROR [type: ATOM, message: ROPE, cellType: CellType]; PinsCorrespondingToSeveralPublics: SIGNAL [cellType: CellType, obj: Object, publics: Wires, geometry: CoreGeometry.Instances]; NoPinsOnAtomicPublic: SIGNAL [cellType: CellType, obj: Object, public: Wire, message: ROPE _ NIL]; FromLayoutWithoutPublic: PROC [obj: Object] RETURNS [cellType: CellType]; END. "ÆPWCore.mesa Copyright c 1985, 1986 by Xerox Corporation. All rights reversed. Louis Monier February 14, 1986 11:00:35 am PST Bertrand Serlet, March 15, 1987 10:12:15 pm PST Theory This interface defines how to generate layout attached to Core, using PatchWork (PW). Layout done by hand can also be attached. When layout is attached to Core, it is also specified how to decorate the original Core source with the interface geometry. The only way for clients to retrieve the Layout hanging on a Core CellType is Layout. Basics Primitive operations obj is the layout for cellType. Identical (REF equal) cellTypes must have the same (REF equal) layout, and the same layout must correspond to the same cellType. To follow this restriction, the Layout function automatically insert one level of indirection (Indirect object). Decorates cellType with the geometric information derived from obj. That is decorates the atomic publics with the pins. This function allows the computation of arbitrary attributes that can be stored on the cellType for the LayoutProc. LayoutProcs are not directly accessible and must be associated with an atom. This delayed generation allows description or simulation of the Core structure before any geometry is present, and lazy evaluation of the geometry improves efficiency. decorateProc can only be NIL if layoutProc is decorating its argument. Retrieves the registration of layoutAtom. Might load some program according to the ChipNDale-CD-PWCore.CDLoadList. Retrieves the layoutAtom (if any) on the CellType, then on the CellClass. Retrieves the layout corresponding to a cell type by: - fetching the layoutAtom with the function GetLayoutAtom (property layoutAtomProp), and finding the corresponding layoutProc and decorateProc, - if that fails start all over again with the recast of cellType. - evaluating the attributesProc, - evaluating layoutProc, - using the decorateProc to decorate the original cellType - returning an indirect object of obj with a funny ExtractProc. The result is cached, so that means that called twice with the same (REF equal) cellType, Layout will produce the same (REF equal) obj. To follow the restriction that the same layout can not correspond to two different cellTypes, Layout automatically inserts one level of indirection (indirect object). The extraction of the indirect object returns a CellType of class layoutClass that contains the source layout and the source CellType, and that recasts in a recordCell with only one sub cellType being the result of the extraction of the source layout. For backward compatibility and ease of use Predefined layoutAtoms Predefined layoutAtoms to be used in schematics $Get and $GetAndFlatten: expect a $PWCoreSourceDesign property [of type CD.Design] on the cellType. The Object of name the name of the CellType concatenated with maskSuffix is fetched in the attribute Design, and is Extracted. Publics of the extracted CellType must correspond [by full name] to the original public. GetAndFlatten flattens the layout, so that corresponding transistors inter-cells are fused. $AbutX, $AbutY, $ReverseAbutX, $ReverseAbutY: the cellType must be a recordCell. Sorts the instances according to the Sisyph decoration. $ArrayX, $ArrayY, $ReverseArrayX, $ReverseArrayY: the cellType must be a sequenceCell. $FlipX, $FlipY, $Rot90, $Rot180, $Rot270: the cellType must be a RecordCell with a unique instance. Predefined layoutAtoms to be used by code $Value: expects a $PWCoreValue property [of type Object] on the cellType. The Object is extracted, and publics of the extracted CellType must correspond [by full name] to the original public. $RawAbutX, $RawAbutY, $RawReverseAbutX, $RawReverseAbutY: the cellType must be a recordCell. The order of the cell instances is important. $Recast: the cellType must have a Recast proc and the recasted cellType must have layout. Contains the rope that is to be concatenated to the name of a cellType to find the name of the corresponding layout cell. Used by the LayoutProc for $Get Global Variable A global variable is used for calling Sinix. This is going to change soon, but for now that is fine enough. Better rollback between changes, if you don't know what you are doing. Contains the mode that is to be passed to Sinix when doing extraction. Its default is SinixOps.GetExtractMode[$cmosB]. Short cuts for the designer Attaches the atom as a property (layoutAtomProp) of the cell type. If the user wants to supply some data, this data is stored under the property userDataProp on the cellType. The implementation is the following: CoreProperties.PutCellTypeProp[cellType, layoutAtomProp, layoutAtom]; IF userDataProp#NIL THEN CoreProperties.PutCellTypeProp[cellType, userDataProp, userData]; Fetches layout from a source design. For cases when designer knows the layout of a cellType (without any lazyness), and has already decorated cellType with the interface decorations. Creates a new cellType which layout is the same as the rotatedCellType, but rotated by orientation. Help for writing DecorateProcs Returns TRUE if the first position is "before" the second Provokes an extraction. Assumes the the full names of the publics cellType and the extracted CellType are corresponding. Assumes that cellType is a record Cell for which each sub cell type has layout. Assumes that obj (when expanded the appropriate number of times) is a CD Cell that contains translations of the layouts of the sub cell types. Does not provoke an extraction. Assumes that cellType and its recast have similar public. Copies the decorations of the recast. Does not provoke an extraction. Assumes that cellType is a RecordCell with a unique instance, and obj a CD Cell with a unique instance. Conceptually flattens obj (stopping for the cellTypes which have an associated layout), extracts it, sorts its instances, assumes they match the instances of cellType, and finally decorates cellType in accord to this sort. Wires that have their own geometry (not part of an instance) are matched by name. This function modifies physically the instances of cellType, by permuting the ith and the jth instance when sort (called with the positions of the instances) returns FALSE (for i.core". Stores the layout on the file named "Layout.dale". Stores a shell of the layout on the file named "Shell.dale". Retrieves the decorated Core itself from the file named ".core". Backdoor for clients such as PWCoreLichen For information only For information only Returns all the information implicitly contained in a Layout CellType. This function returns a cellType of class layoutClass such as Layout[layoutCellType.data.cellType]=obj, if any, NIL otherwise. In particular, obj.class#indirect => layoutCellType=NIL. This function is used for checking the isomorphism between the source Core and the extracted Core. Exceptions All the escapes from PWCore functions are described in this section. This SIGNAL is called when implementor should be called ... This ERROR is called when attachment of layout is impossible. Current types are: $NoLayoutAtom $NoRegistration $InternalBug $CallerBug This Signal is called during or after decoration of cellType, when some interface geometry corresponds to two several atomic wires of cellType. The variable publics holds the list of atomic publics corresponding; geometry holds all the geometry in error. This Signal is called during or after decoration of cellType. The variable public holds the atomic public which has no geometry. For those who really want to live dangerously ... This PROC is used to bypass all checks and get the Core description directly from the Layout using Sinix. Avoid using it! ʶ˜– "Cedar" stylešœ ™ Jšœ Ïmœ7™BIcodešœ+Ïk™.Kšœ/™/—J˜šž œ˜ Jšžœžœ0˜8Jšœ˜Jšœ žœžœ˜J˜ Jšœ žœ ˜Jšœžœ˜—J˜Jš Ðbnœžœž œžœžœž˜,head™IbodyšœQžœ™Ô—™Kšœ žœ˜Kšœžœžœ˜Kšœžœ ˜Kšœ žœ˜Kšžœžœžœ˜Kšœ žœ˜#Kšœžœ˜—™šœ žœžœžœ˜CKšœ!™!Kšœ žœ&žœ»™òK™—šœžœžœ#˜J™3J™KJ™BJ™LJ™—š œžœžœžœ˜9J™P——™)Jšœ¡3˜PJ˜šœ žœžœžœ˜-J™—šœžœžœžœ˜&Jšœ¡$˜3Jšœ¡˜3Jšœ¡'˜8J˜J™J˜—š œžœžœ`˜›J™FJ˜—š œžœžœžœ˜SJšœpžœ ™~Jšœ4žœ™8Jšœb™b——™ M™DM˜š œžœ˜%šœžœ0™;J™——š œžœžœ žœ˜>šœžœG™QJ™ Jšœ™J™ J™ J™——š !œžœU˜~šœ™J™——š œžœ:žœžœ˜bJšœ‚™‚——™1š œžœžœ˜IKšœžœq™zK™——Jšžœ˜—…—®:*