;========================================================================== ; ; $Id: devices.tf,v 1.1.1.1 2006/02/10 16:32:38 slipa Exp $ ; ;-------------------------------------------------------------------------- ; ; ELB - modified by Erik Brunvand for UofU_AMI_C5N technology 3/25/06 ; based on modifications originally made by ELB in CDK1.4 ; - Make symcontact cells left-bottom instead of center-center so ; that arrays of symcontacts still fall on the grid ; - Added SUBTAP symcontact as a substrate contact ; - Changed the size of the NTAP to match the SUBTAP ; - Add metal<1,2,3> pin-layer to the metal sympins so that ; place and route cells that may use pin-layer rectangles will ; work properly. This makes pin-layer the same as drawing-layer ; for most purposes. ; - Add ruleContactDevice definitions for ruleVia and ruleVia2. These ; are tiled vias that the place and route tools use for large ; connections and must be in the tech file if you're reading ; place and route cells back into dfII devices( let( (technology lambda wellType contactSpacing submicronAvailable deepAvailable cwellAvailable polycapAvailable metal3Available metal4Available metal5Available metal6Available npnAvailable ccdAvailable elecAvailable sblockAvailable) technology = techParam( "technology" ) if( NCSU_techData[ technology ] == nil then hiGetAttention() error( "Unrecognizable \"technology\" property!" ) ) wellType = substring( NCSU_techData[ technology ]->mosisCode 3 1 ) submicronAvailable = NCSU_techData[ technology ]->submicronRules deepAvailable = NCSU_techData[ technology ]->deepRules lambda = atof( NCSU_techData[ technology ]->lambda ) cwellAvailable = techParam( "cwellAvailable" ) polycapAvailable = techParam( "polycapAvailable" ) npnAvailable = techParam( "npnAvailable" ) elecAvailable = techParam( "elecAvailable" ) ccdAvailable = techParam( "ccdAvailable" ) metal3Available = techParam( "metal3Available" ) metal4Available = techParam( "metal4Available" ) metal5Available = techParam( "metal5Available" ) metal6Available = techParam( "metal6Available" ) sblockAvailable = techParam( "sblockAvailable" ) hvAvailable = techParam( "hvAvailable" ) ; Set contact spacing here. Saves room later. cond( ( submicronAvailable contactSpacing = 5*lambda ) ( deepAvailable contactSpacing = 6*lambda ) ( t contactSpacing = 4*lambda ) ) tcCreateCDSDeviceClass() /* * symbolic contacts * * Format: * * (name viaLayer viaPurpose * layer1 purpose1 [(enclosure1 encpurpose1 encspacing1)] * layer2 purpose2 [(enclosure2 encpurpose2 encspacing2)] * width length * (rows cols xPitch yPitch xBias yBias) * encByLayer1 encByLayer2 legalRegion) * * See "Technology File and Display Resource File User Guide" for more info */ cond( ( wellType == "P" symContactDevice( (M1_P cc drawing pactive drawing (pselect drawing (lambda * 2.0)) metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 1.0) (lambda * 1.0) (outside pwell drawing)) (M1_N cc drawing nactive drawing (nselect drawing (lambda * 2.0)) metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 1.0) (lambda * 1.0) (inside pwell drawing)) (PTAP cc drawing pwell drawing (pselect drawing (lambda * -1.0)) metal1 drawing (pactive drawing 0) (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 4.0) (lambda * 1.0) (inside pwell drawing)) ) ) ( wellType == "E" symContactDevice( (M1_P cc drawing pactive drawing (pselect drawing (lambda * 2.0)) metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 1.0) (lambda * 1.0) (inside nwell drawing)) (M1_N cc drawing nactive drawing (nselect drawing (lambda * 2.0)) metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 1.0) (lambda * 1.0) (inside pwell drawing)) (PTAP cc drawing pwell drawing (pselect drawing (lambda * -1.0)) metal1 drawing (pactive drawing 0) (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 4.0) (lambda * 1.0) (inside pwell drawing)) (NTAP cc drawing nwell drawing (nselect drawing (lambda * -1.0)) metal1 drawing (nactive drawing 0) (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 4.0) (lambda * 1.0) (inside nwell drawing)) ) ) ( t /* ELB changes here - contact spacing changed to left-bottom from center-center */ /* These changes are for the UofU_AMI_C5N technology only... */ (cond /* new cond to check for UofU_AMI_C5N */ (technology == "UofU_AMI_C5N" symContactDevice( (M1_P cc drawing pactive drawing (pselect drawing (lambda * 2.0)) metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing left bottom) (lambda * 1.0) (lambda * 1.0) (inside nwell drawing)) (M1_N cc drawing nactive drawing (nselect drawing (lambda * 2.0)) metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing left bottom) (lambda * 1.0) (lambda * 1.0) (outside nwell drawing)) /* * NTAP is further modifed to have a spacing * that matches our 2.4u standard grid * size for our standard cell library. This * way you get one NTAP per standard cell * width unit. */ (NTAP cc drawing nwell drawing (nselect drawing (lambda * -1.0)) metal1 drawing (nactive drawing 0) (lambda * 2.0) (lambda * 2.0) (1 1 2.4 2.4 left bottom) (lambda * 4.0) (lambda * 1.0) (inside nwell drawing)) ) ; symContactDevice ) ; technology = UofU_AMI_C5N (t /* NOT UofU_AMI_C5N - use the NCSU defaults */ symContactDevice( (M1_P cc drawing pactive drawing (pselect drawing (lambda * 2.0)) metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 1.0) (lambda * 1.0) (inside nwell drawing)) (M1_N cc drawing nactive drawing (nselect drawing (lambda * 2.0)) metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 1.0) (lambda * 1.0) (outside nwell drawing)) (NTAP cc drawing nwell drawing (nselect drawing (lambda * -1.0)) metal1 drawing (nactive drawing 0) (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 4.0) (lambda * 1.0) (inside nwell drawing)) ) ; symContactDevice ) ; new paren to match the NOT UofU_AMI_C5N ) ; new paren to match the new cond ) ; t (i.e. not well P or E) ) ; cond /* * Added by ELB - if you're using UofU_AMI_C5N, then add a SUBTAP symContactDevice * for a substrate contact (i.e. pactive outside an Nwell) * * Also add P_CC and N_CC symbolic contacts for M1-active contacts without select. * These are commented out for now... */ if( technology == "UofU_AMI_C5N" then symContactDevice( (SUBTAP cc drawing pactive drawing (pselect drawing (lambda * 2.0)) metal1 drawing (lambda * 2.0) (lambda * 2.0) /* * note that SUBTAP spacing could have been on contactSpacing pitch, but * if it's 2.4 then it matches the standard grid of our standard cell * library. One SUBTAP per standard cell width unit... */ (1 1 2.4 2.4 left bottom) (lambda * 1.0)(lambda * 1.0) (outside nwell drawing)) /* (P_CC cc drawing * pactive drawing * metal1 drawing * (lambda * 2.0) (lambda * 2.0) * (1 1 contactSpacing contactSpacing left bottom) * (lambda * 1.0) (lambda * 1.0) (inside nwell drawing)) * * (N_CC cc drawing * nactive drawing * metal1 drawing * (lambda * 2.0) (lambda * 2.0) * (1 1 contactSpacing contactSpacing left bottom) * (lambda * 1.0) (lambda * 1.0) (outside nwell drawing)) */ ) ; symContactDevice for SUBTAP ) ; if UofU_AMI_C5N /* ELB change - M1_POLY changed to be on left-bottom instead of center-center */ if( technology == "UofU_AMI_C5N" then symContactDevice( (M1_POLY cc drawing poly drawing metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing left bottom) (lambda * 1.0) (lambda * 1.0) _NA_) ) ; symContactDevice else symContactDevice( (M1_POLY cc drawing poly drawing metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 contactSpacing contactSpacing center center) (lambda * 1.0) (lambda * 1.0) _NA_) ) ; symContactDevice ) ; if UotU_AMI_C5N if( npnAvailable then symContactDevice( (M1_COLLECTOR cc drawing cactive drawing metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 4.0) (lambda * 4.0) center center) (lambda * 2.0) (lambda * 1.0) _NA_) ) symContactDevice( (M1_EMITTER cc drawing nselect drawing metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 4.0) (lambda * 4.0) center center) (lambda * 3.0) (lambda * 1.0) _NA_) ) symContactDevice( (M1_BASE cc drawing pselect drawing metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 4.0) (lambda * 4.0) center center) (lambda * 2.0) (lambda * 1.0) _NA_) ) ) if( polycapAvailable then symContactDevice( (M1_POLYCAP cc drawing polycap drawing metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 4.0) (lambda * 4.0) center center) (lambda * 2.0) (lambda * 1.0) _NA_) ) ) if( elecAvailable then /* ELB change - M1_ELEC changed to be on left-bottom instead of center-center */ if( technology == "UofU_AMI_C5N" then symContactDevice( (M1_ELEC cc drawing elec drawing metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 4.0) (lambda * 4.0) left bottom) (lambda * 2.0) (lambda * 1.0) _NA_) /* * Added another contact to make abstract happy - it wants to make sure * it knows about any contacts between layers defined as vialayers in the * layerRules.tf file, viaLayers section. */ (M1_ce ce drawing elec drawing metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 4.0) (lambda * 4.0) left bottom) (lambda * 2.0) (lambda * 1.0) _NA_) ) ; symContactDevice else symContactDevice( (M1_ELEC cc drawing elec drawing metal1 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 4.0) (lambda * 4.0) center center) (lambda * 2.0) (lambda * 1.0) _NA_) ) ; symContactDevice ) ; if UofU_AMI_C5N ) ; if elecAvailable if( deepAvailable then symContactDevice( (M2_M1 via drawing metal1 drawing metal2 drawing (lambda * 3.0) (lambda * 3.0) (1 1 (lambda * 6.0) (lambda * 6.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) ) else /* ELB change - M1_M2 changed to be on left-bottom instead of center-center */ if( technology == "UofU_AMI_C5N" then symContactDevice( (M2_M1 via drawing metal1 drawing metal2 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) left bottom) (lambda * 1.0) (lambda * 1.0) _NA_) ) else symContactDevice( (M2_M1 via drawing metal1 drawing metal2 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) ) ) ; if UofU_AMI_C5N ) ; if deepAvailable if( cwellAvailable then symContactDevice( (M1_CAP cc drawing metal1 drawing active drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) center center) (lambda * 1.0) (lambda * 2.0) (inside cwell drawing)) ) ) cond( (metal6Available && deepAvailable symContactDevice( (M6_M5 via5 drawing metal5 drawing metal6 drawing (lambda * 4.0) (lambda * 4.0) (1 1 (lambda * 8.0) (lambda * 8.0) center center) (lambda * 1.0) (lambda * 2.0) _NA_) (M5_M4 via4 drawing metal4 drawing metal5 drawing (lambda * 3.0) (lambda * 3.0) (1 1 (lambda * 6.0) (lambda * 6.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) (M4_M3 via3 drawing metal3 drawing metal4 drawing (lambda * 3.0) (lambda * 3.0) (1 1 (lambda * 7.0) (lambda * 7.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) (M3_M2 via2 drawing metal2 drawing metal3 drawing (lambda * 3.0) (lambda * 3.0) (1 1 (lambda * 6.0) (lambda * 6.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) ) ) (metal6Available && submicronAvailable symContactDevice( (M6_M5 via5 drawing metal5 drawing metal6 drawing (lambda * 3.0) (lambda * 3.0) (1 1 (lambda * 7.0) (lambda * 7.0) center center) (lambda * 1.0) (lambda * 2.0) _NA_) (M5_M4 via4 drawing metal4 drawing metal5 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) (M4_M3 via3 drawing metal3 drawing metal4 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 6.0) (lambda * 6.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) (M3_M2 via2 drawing metal2 drawing metal3 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) ) ) (metal5Available && deepAvailable symContactDevice( (M5_M4 via4 drawing metal4 drawing metal5 drawing (lambda * 3.0) (lambda * 3.0) (1 1 (lambda * 6.0) (lambda * 6.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) (M4_M3 via3 drawing metal3 drawing metal4 drawing (lambda * 3.0) (lambda * 3.0) (1 1 (lambda * 7.0) (lambda * 7.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) (M3_M2 via2 drawing metal2 drawing metal3 drawing (lambda * 3.0) (lambda * 3.0) (1 1 (lambda * 6.0) (lambda * 6.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) ) ) (metal5Available && submicronAvailable symContactDevice( (M5_M4 via4 drawing metal4 drawing metal5 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) (M4_M3 via3 drawing metal3 drawing metal4 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 6.0) (lambda * 6.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) (M3_M2 via2 drawing metal2 drawing metal3 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) ) ) (metal4Available symContactDevice( (M4_M3 via3 drawing metal3 drawing metal4 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 6.0) (lambda * 6.0) center center) (lambda * 1.0) (lambda * 2.0) _NA_) (M3_M2 via2 drawing metal2 drawing metal3 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) center center) (lambda * 1.0) (lambda * 1.0) _NA_) ) ) (metal3Available /* ELB change - M3_M2 changed to be on left-bottom instead of center-center */ if( technology == "UofU_AMI_C5N" then symContactDevice( (M3_M2 via2 drawing metal2 drawing metal3 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) left bottom) (lambda * 1.0) (lambda * 2.0) _NA_) ) else symContactDevice( (M3_M2 via2 drawing metal2 drawing metal3 drawing (lambda * 2.0) (lambda * 2.0) (1 1 (lambda * 5.0) (lambda * 5.0) center center) (lambda * 1.0) (lambda * 2.0) _NA_) ) ) ; if UofU_AMI_C5N ) ; metal3Available ) ; cond ;---------------- end contacts ; ; no depletion devices ; ; ; no enhancement devices - if we ever use LAS, then we'll need them... ; /* * symbolic pins * * (name maskable layer1 purpose1 w1 layer2 purpose2 w2 legalRegion) */ cond( ( wellType == "P" symPinDevice( (pwell nil pwell drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) ) ) ( wellType == "E" symPinDevice( (pwell nil pwell drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) (nwell nil nwell drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) ) ) ( wellType == "N" symPinDevice( (nwell nil nwell drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) ) ) ) symPinDevice( (nactive nil nactive drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) (pactive nil pactive drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) (active nil active drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) (poly nil poly drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) /* ELB - commented out - added back in below... */ /* (metal1 nil metal1 drawing (lambda * 3.0) _NA_ _NA_ _NA_ _NA_) */ /* (metal2 nil metal2 drawing (lambda * 3.0) _NA_ _NA_ _NA_ _NA_) */ ) /* * changed by ELB - if UofU_AMI_C5N, add a purpose-pin layer * to the metal1 and metal2 symPins */ cond( ( technology == "UofU_AMI_C5N" symPinDevice( (metal1 nil metal1 drawing (lambda * 3.0) metal1 pin (lambda * 3.0) _NA_) (metal2 nil metal2 drawing (lambda * 3.0) metal2 pin (lambda * 3.0) _NA_))) ( t symPinDevice( (metal1 nil metal1 drawing (lambda * 3.0) _NA_ _NA_ _NA_ _NA_) (metal2 nil metal2 drawing (lambda * 3.0) _NA_ _NA_ _NA_ _NA_))) ) if( npnAvailable then symPinDevice( (cactive nil cactive drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) ) ) if( hvAvailable then symPinDevice( (tactive nil tactive drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) ) ) if( cwellAvailable then symPinDevice( (cwell nil cwell drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) ) ) if( elecAvailable then symPinDevice( (elec nil elec drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) ) ) if( polycapAvailable then symPinDevice( (polycap nil polycap drawing (lambda * 2.0) _NA_ _NA_ _NA_ _NA_) ) ) if( metal3Available then /* * changed by ELB - if UofU_AMI_C5N, add a purpose-pin layer * to metal3 symPins */ cond( ( technology == "UofU_AMI_C5N" symPinDevice( (metal3 nil metal3 drawing (lambda * 3.0) metal3 pin (lambda * 3.0) _NA_))) ( t symPinDevice( (metal3 nil metal3 drawing (lambda * 3.0) _NA_ _NA_ _NA_ _NA_)))) ) if( metal4Available then symPinDevice( (metal4 nil metal4 drawing (lambda * 3.0) _NA_ _NA_ _NA_ _NA_) ) ) if( metal5Available then symPinDevice( (metal5 nil metal5 drawing (lambda * 3.0) _NA_ _NA_ _NA_ _NA_) ) ) if( metal6Available then symPinDevice( (metal6 nil metal6 drawing (lambda * 3.0) _NA_ _NA_ _NA_ _NA_) ) ) ; ; no ruleContact devices ; /* ELB change */ if( technology == "UofU_AMI_C5N" then ; ; Actually, we REALLY do need ruleContact devices. These are used by ; sedsm and are critical for reading in .def files from placed and ; routed circuits from sedsm. The most critical thing seems to be that ; the rulevias are defined in the tech file. The numbers apparently aren't ; used directly. It appears that the def file overrides these defaults ; with the real rulevia parameters for any individual use of a rulevia. ; Check the corners of your power ring from a .def design to see if ; this is working correctly... ; ; I've seen the ruleVia being used. I have no idea if the .def ever produces ; something that wants a ruleVia2, but it could happen I suppose depending ; on where you're routing your vdd and gnd layers... ; ruleContactDevice( ; ( viaName (layer1 purpose1 layer1BBox1 [layer1BBox2 ...]) ; (viaLayer viaPurpose viaLayerBBox1 [viaLayerBBox2 ...]) ; (layer2 purpose2 layer2BBox1 [layer2BBox2 ...]) ; ) ( ruleVia ( metal1 drawing ( -1.500000 -0.900000 1.500000 0.900000 ) ) ( via drawing ( -0.900000 -0.300000 -0.300000 0.300000 ) ( 0.300000 -0.300000 0.900000 0.300000 ) ) ( metal2 drawing ( -1.500000 -0.900000 1.500000 0.900000 ) ) ) ( ruleVia2 ( metal2 drawing ( -1.500000 -0.900000 1.500000 0.900000 ) ) ( via2 drawing ( -0.900000 -0.300000 -0.300000 0.300000 ) ( 0.300000 -0.300000 0.900000 0.300000 ) ) ( metal3 drawing ( -1.500000 -0.900000 1.500000 0.900000 ) ) ) ) ; ELB - end of ruleContactDevice ) ; ELB - end of if UofU_AMI_C5N ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Opus Symbolic Device Class Definition ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; no other device classes ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Opus Symbolic Device Declaration ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; no other devices ; ) ; let ) ;devices ; vim:ts=4:columns=132: