<> <> <> <> DIRECTORY CD, Rope, SymTab; CDDesignRules: CEDAR DEFINITIONS = BEGIN <<>> <> <> <> <<>> <<>> <> <<>> DesignRules: TYPE = REF DesignRulesRep; DesignRulesRep: PRIVATE TYPE; NotKnown: ERROR; FindRules: PROC[a: ATOM] RETURNS [dr: DesignRules]; <<--NIL if not found>> <<>> <<>> <> MinWidth: PROC [dr: DesignRules, layer: CD.Layer] RETURNS [CD.Number]; <<-- Minimum width of conductors.>> <<-- (Width of interrest rect).>> MinDist: PROC [dr: DesignRules, l1, l2: CD.Layer] RETURNS [CD.Number]; <<-- Minimum distance between unconnected conductors.>> <<-- 0 if no interaction.>> <<-- Error if l1 and l2 from different technologies. >> <<-- (Distance of interrest rects).>> MinConnectedDist: PROC [dr: DesignRules, l1, l2: CD.Layer] RETURNS [CD.Number]; <<-- Minimum distance between connected conductors.>> <<-- 0 if no interaction.>> <<-- Error if l1 and l2 from different technologies. >> <<-- (Distance of interrest rects).>> <<>> <<>> <> GetTechnology: PROC [DesignRules] RETURNS [CD.Technology]; GetLayer: PROC [technology, layer: REF] RETURNS [CD.Layer] = INLINE { CDSimpleRules.GetLayer[technology, layer] }; <<-- Tries to figure out a layer, given names. >> <<-- Use only to get technology specific names. >> <<-- A little bit more forgiving than CD.FetchLayer...>> <<-- Error if not known.>> Rect: PROC [size: CD.Position, layer: CD.Layer] RETURNS [CD.Object] = INLINE { CDSimpleRules.Rect[size, layer] }; <<-- size: interest rect>> Contact: PROC [dr: DesignRules, l1, l2: CD.Layer, size: CD.Position] RETURNS [CD.Object]; <<-- nil if certain complication or no contact possible...>> <<-- use CD.InterestRect to get size; >> <<-- CHECK size: procedure may make approximations !>> <<>> Transistor: PROC [dr: DesignRules, difL: CD.Layer, w, l: CD.Number] RETURNS [CD.Object]; <<-- nil if some complication or no contact possible...>> <<-- w and l are gate width and length, not object size >> <<-- procedure may make approximations if the technology considers the aequivalent >> <<-- use CD.InterestRect to get object size; >> <<>> LayerOk: PROC [dr: DesignRules, layer: CD.Layer] RETURNS [BOOL]; ObjectClassOk: PROC [dr: DesignRules, class: CD.ObjectClass] RETURNS [OKness]; OKness: TYPE = {yes, no, depends}; ObjectOk: PROC [dr: DesignRules, ob: CD.Object] RETURNS [BOOL]; <<>> <<>> <> <<>> DummyConnectorCell: PROC [dr: DesignRules, ob: CD.Object] RETURNS [--READONLY--CD.Object]; <<--returns a dummy cell which is NOT part of the design>> <<--dummy cell must not be modified>> <<--dummy cell has symbolic object denoting the interconnect area>> DummyGateCell: PROC [dr: DesignRules, trans: CD.Object] RETURNS [--READONLY--CD.Object]; <<--returns a dummy cell which is NOT part of the design>> <<--dummy cell must not be modified>> <<--dummy cell has symbolic object denoting the gate area>> <<>> TransistorRatio: PROC [trans: CD.Object] RETURNS [w, l: CD.Number]; <<--not size !>> <<>> <<>> <> NeedSurround: PROC [layer: CD.Layer] RETURNS [surList: LIST OF LayerAndDistance]; <<-- treat surList as READONLY>> LayerAndDistance: TYPE = RECORD [layer: CD.Layer, amount: CD.Number]; <<--positive means grow>> <<>> WellConnectMaximalDistance: PROC [dr: DesignRules, layer: CD.Layer] RETURNS [n: CD.Number]; <<-- 0 if connection not necessary or has a square rule>> <<-- layer must be a well layer>> <<-- you must know to what node to connect by some other mean>> <<>> WellConnectMaximalSquares: PROC [dr: DesignRules, layer: CD.Layer] RETURNS [n: INT]; <<-- 0 if connection not necessary or has a constant rule>> <<-- layer must be a well layer>> <<-- you must know to what node to connect by some other mean>> <<>> <<>> <<>> <> Flattness: PROC [dr: DesignRules, ob: CD.Object] RETURNS [LIST OF FlattnessArea]; <<--treat result as READONLY>> <<--Each FlattnessArea is independent from each other FlattnessArea; all must be satisfied>> <<>> FlattnessArea: TYPE = RECORD[where: LIST OF CD.Rect, condition: LIST OF PerLayer]; <<--each point described by where must fullfill all conditions >> PerLayer: TYPE = RECORD [layer: CD.Layer, avoid, surround: CD.Numberr]; <<--avoid, surround >0 means grow, <0 means shrink>> <<--the layer is either to be comletely surrounded by surround or avoided by avoid>> <<-- ok this can not describe minimum distance or surround conditions, >> <<-- but use minimum distance or surround rules to describe those requirements!>> <<>> <> SpecialRule: PROC [dr: DesignRules, rule: ATOM, x: REF] RETURNS [REF]; <<--returns NIL if not specified>> <<--rule: manual registration>> PutProp: PROC [dr: DesignRules, prop: REF, val: REF]; GutProp: PROC [dr: DesignRules, prop: REF] RETURNS [val; REF]; <<--prop must fulfill regstration rules of CDProperties>> <<>> <<>> <<>> <> ImplementSpecialRule: PROC [dr: DesignRules, rule: ATOM, proc: PROC [DesignRules, ATOM, REF] RETURNS [REF]]; <<>> ImplementDesignRules: PROC [key: ATOM, technology: CD.Technology, rules: SOME MAGIC ] RETURNS [designrules: DesignRules]; <<--error if redefined>> END.