;================================================================================ ; Robert Johnstone ; Simon Fraser University ; ; Copyright 2002 Robert W. Johnstone ;-------------------------------------------------------------------------------- ; 2002/01/21 ; - modified code to include flexure in wide arm near centre ; - parameter "flexure" added ; 2002/01/10 ; - first version unless( boundp( 'admLibraryName ) warn( "Setting the destination library to default value of ADM" ) admLibraryName = "ADM" ) pcDefinePCell( list( ddGetObj(admLibraryName) "teduator" "layout" ) ; end of list for first argument ( ( length 200.0 ) ( flexure 0.0 ) ( gap 2.0 ) ( chamfer 0.0 ) ( width_c 15.0 ) ( width_h 2.0 ) ( cross1 9.0 ) ( cross2 9.0 ) ( actuation 10.0 ) ( pin_size 20.0 ) ( pin_spacing 2.0 ) ( include_poly0 "boolean" t ) ) ; end of parameter list prog( ; declare variables ( pcTechFile pcNet pcPin rodObj p0p1_enclosure p0p1_minSpacing p1_minSpacing p1_minWidth p1_nomSpacing p1d_enclosure p1a1_enclosure p1p2_enclosure p2v_enclosure p2m_enclosure d_maxSpacing d_nomWidth tmp1 tmp2 tmp3 tmp4 dimple_count ) ; load tech file rules pcTechFile = techGetTechFile( pcCellView ) p0p1_enclosure = techGetOrderedSpacingRule( pcTechFile "minEnclosure" "POLY0" "POLY1" ) unless( p0p1_enclosure warn("minEnclosure rule for POLY0->POLY1 not set") ) p0p1_minSpacing = techGetSpacingRule( pcTechFile "minSpacing" "POLY0" "POLY1" ) unless( p0p1_minSpacing warn("minSpacing rule for POLY0 and POLY1 not set") ) p1_minSpacing = techGetSpacingRule( pcTechFile "minSpacing" "POLY1" ) unless( p1_minSpacing warn("minSpacing rule for POLY1 not set") ) p1_minWidth = techGetSpacingRule( pcTechFile "minWidth" "POLY1" ) unless( p1_minWidth warn("minWidth rule for POLY1 not set") ) p1_nomSpacing = techGetSpacingRule( pcTechFile "nomSpacing" "POLY1" ) unless( p1_nomSpacing warn("nomSpacing rule for POLY1 not set") ) p1a1_enclosure = techGetOrderedSpacingRule( pcTechFile "minEnclosure" "POLY1" "ANCHOR1" ) unless( p1a1_enclosure warn("minEnclosure rule for POLY1->ANCHOR1 not set") ) p1p2_enclosure = techGetOrderedSpacingRule( pcTechFile "minEnclosure" "POLY1" "POLY2" ) unless( p1p2_enclosure warn("minEnclosure rule for POLY1->POLY2 not set") ) p1d_enclosure = techGetOrderedSpacingRule( pcTechFile "minEnclosure" "POLY1" "DIMPLE" ) unless( p1d_enclosure warn("minEnclosure rule for POLY1->DIMPLE not set") ) p2v_enclosure = techGetOrderedSpacingRule( pcTechFile "minEnclosure" "POLY2" "P1P2VIA" ) unless( p2v_enclosure warn("minEnclosure rule for POLY2->P1P2VIA not set" ) ) p2m_enclosure = techGetOrderedSpacingRule( pcTechFile "minEnclosure" "POLY2" "METAL" ) unless( p2m_enclosure warn("minEnclosure rule for POLY2->METAL not set" ) ) d_maxSpacing = techGetSpacingRule( pcTechFile "maxSpacing" "DIMPLE" ) unless( d_maxSpacing warn("maxSpacing rule for DIMPLE not set") ) d_nomWidth = techGetSpacingRule( pcTechFile "nomWidth" "DIMPLE" ) unless( d_nomWidth warn("nomWidth rule for DIMPLE not set") ) ; check parameters gap = if( (gap0) then dbCreatePolygon( pcCellView "POLY1" list( pin_spacing*0.5:0 pin_spacing*0.5:tmp2 length*0.5-cross1:tmp2 length*0.5-cross1:tmp3 -length*0.5+cross1:tmp3 -length*0.5+cross1:tmp2 -pin_spacing*0.5:tmp2 -pin_spacing*0.5:0 -cross2-pin_spacing*0.5:0 -cross2-pin_spacing*0.5:tmp1 -length*0.5:tmp1 -length*0.5:tmp4 -flexure*0.5:tmp4 -flexure*0.5:tmp3+p1_minWidth flexure*0.5:tmp3+p1_minWidth flexure*0.5:tmp4 length*0.5:tmp4 length*0.5:tmp1 cross2+pin_spacing*0.5:tmp1 cross2+pin_spacing*0.5:0 ) ) dbCreateRect( pcCellView "TMP" list( -p1_minWidth*0.5:tmp4+p1_minWidth p1_minWidth*0.5:tmp4 ) ) else dbCreatePolygon( pcCellView "POLY1" list( pin_spacing*0.5:0 pin_spacing*0.5:tmp2 length*0.5-cross1:tmp2 length*0.5-cross1:tmp3 -length*0.5+cross1:tmp3 -length*0.5+cross1:tmp2 -pin_spacing*0.5:tmp2 -pin_spacing*0.5:0 -cross2-pin_spacing*0.5:0 -cross2-pin_spacing*0.5:tmp1 -length*0.5:tmp1 -length*0.5:tmp4 length*0.5:tmp4 length*0.5:tmp1 cross2+pin_spacing*0.5:tmp1 cross2+pin_spacing*0.5:0 ) ) dbCreateRect( pcCellView "TMP" list( -p1_minWidth*0.5:tmp4+p1_minWidth p1_minWidth*0.5:tmp4 ) ) ) ; poly0 enclosure if( (include_poly0==t) then tmp1 = length*0.5 + p0p1_enclosure tmp2 = tmp4 + p0p1_enclosure + actuation dbCreateRect( pcCellView "POLY0" list( -tmp1:tmp2 tmp1:p0p1_minSpacing ) ) ) ; create the stop label if( (actuation>0) then tmp1 = ( width_c + gap + width_h ) * 0.5 tmp2 = tmp4 + actuation dbCreateRect( pcCellView "LABEL" list( -tmp1:tmp2 tmp1:tmp2+1 ) ) dbCreateLabel( pcCellView '("TMP" "drawing") 0:tmp2-1 "STOP LINE" "upperCenter" "R0" "roman" 2.0 ) ) ; create PWR pin pcNet = dbMakeNet( pcCellView "PWR" ) pcPin = dbCreateMumpsPin( pcCellView pcNet -pin_size*0.5-pin_spacing*0.5:-pin_size*0.5 pin_size chamfer ) pcPin~>accessDir = list( "bottom" "left" ) ; create GND pin pcNet = dbMakeNet( pcCellView "GND" ) pcPin = dbCreateMumpsPin( pcCellView pcNet pin_size*0.5+pin_spacing*0.5:-pin_size*0.5 pin_size chamfer ) pcPin~>accessDir = list( "bottom" "right" ) ; add the dimples if( (dimple_count<1) then warn( "dimple count less than 1 in hatuator pcell." ) ) if( (dimple_count>1) then tmp1 = -length*0.5 + p1d_enclosure tmp2 = p0p1_minSpacing + p0p1_enclosure + width_h + gap + width_c*0.5 - d_nomWidth*0.5 for( lp 0 dimple_count tmp3 = tmp1 + (length-2*p1d_enclosure-d_nomWidth)*lp/dimple_count dbCreateRect( pcCellView "DIMPLE" list( tmp3:tmp2 tmp3+d_nomWidth:tmp2+d_nomWidth ) ) ) else tmp1 = -d_nomWidth*0.5 tmp2 = p0p1_minSpacing + p0p1_enclosure + width_h + gap + width_c*0.5 - d_nomWidth*0.5 dbCreateRect( pcCellView "DIMPLE" list( tmp1:tmp2 tmp1+d_nomWidth:tmp2+d_nomWidth) ) ) ; set default instance name prefix dbReplaceProp( pcCellView "instNamePrefix" "string" "actuator" ) ; set version string dbReplaceProp( pcCellView "version" "string" "1.1.1" ) ; body SKILL code returns value t return(t) ) ; end of body-of-SKILL-code prog ) ; ; end of pcDefinePCell