;================================================================================ ; Robert Johnstone ; Simon Fraser University ; ; Copyright 2000 Robert W. Johnstone ;-------------------------------------------------------------------------------- ; 2002/06/03 ; - modified because interface to dbCreateMumpsRoundRect changed ; 2001/05/18 ; - created unless( boundp( 'admLibraryName ) warn( "Setting the destination library to default value of ADM" ) admLibraryName = "ADM" ) pcDefinePCell( list( ddGetObj(admLibraryName) "heatuator_array" "layout" ) ; end of list for first argument ( ( count 3 ) ( length 200.0 ) ( flexure 40.0 ) ( gap 2.0 ) ( chamfer 0.0 ) ( width_c 15.0 ) ( width_h 2.0 ) ( width_f 2.0 ) ( cross 9.0 ) ( actuation 10.0 ) ( pin_size 20.0 ) ( include_poly0 "boolean" nil ) ) ; end of parameter list prog( let( pcTechFile pcHeatuator pcBridge lp ) ; 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") ) p1_minSpacing = techGetSpacingRule( pcTechFile "minSpacing" "POLY1" ) unless( p1_minSpacing warn("nomSpacing 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") ) p1p2_minSpacing = techGetSpacingRule( pcTechFile "minSpacing" "POLY1" "POLY2" ) unless( p1p2_minSpacing warn("minSpacing rule for POLY1->POLY2 not set") ) ; check parameters gap = if( (gaplib "heatuator" "layout" nil "r" ) for( lp 0 count-1 dbCreateParamInst( pcCellView pcHeatuator nil 0:lp*y_spacing "R0" 1 list( list( "length" "float" length ) list( "flexure" "float" flexure ) list( "gap" "float" gap ) list( "chamfer" "float" chamfer ) list( "width_c" "float" width_c ) list( "width_h" "float" width_h ) list( "width_f" "float" width_f ) list( "cross" "float" cross ) list( "actuation" "float" actuation ) list( "include_stopper" "boolean" nil ) list( "include_poly0" "boolean" include_poly0 ) list( "include_hook" "boolean" t ) list( "pin_size" "float" pin_size ) ) ) dbCreatePolygon( pcCellView "POLY1" list( length+3*p1_minWidth:lp*y_spacing+3*p1_minWidth length+3*p1_minWidth:(lp+1)*y_spacing-2*p1_minWidth length+6*p1_minWidth:(lp+1)*y_spacing+p1_minWidth length+7*p1_minWidth:(lp+1)*y_spacing+p1_minWidth length+7*p1_minWidth:(lp+1)*y_spacing length+4*p1_minWidth:(lp+1)*y_spacing-3*p1_minWidth length+4*p1_minWidth:lp*y_spacing+3*p1_minWidth ) ) ) dbClose( pcHeatuator ) ; add backend pcBridge = dbOpenCellViewByType( pcCellView~>lib "bridge" "layout" nil "r" ) for( lp 0 count-1 dbCreateParamInst( pcCellView pcBridge nil bridge_off:lp*y_spacing-(gap+pin_size)*0.5 "R90" 1 list( list( "pin_size" "float" pin_size ) list( "chamfer" "float" chamfer ) ) ) dbCreateMumpsRoundRect( pcCellView nil list( bridge_off-pin_size*0.5:lp*y_spacing+gap*0.5 0:lp*y_spacing+gap*0.5+pin_size ) chamfer ) ) dbClose( pcBridge ) ; outside conducting line y1 = -pin_size*2 - p1p2_minSpacing - gap*0.5 y2 = (count-1)*y_spacing + pin_size + gap*0.5 + p1p2_enclosure - p1p2_minSpacing x1 = -pin_size*3 - p1_nomSpacing + p1p2_enclosure - p1p2_minSpacing x2 = x1 + pin_size dbCreateMumpsRoundRect( pcCellView nil list( x1:y1 x2:y2 ) chamfer ) ; add main rod dbCreateRect( pcCellView "POLY1" list( length+6*p1_minWidth:y_spacing+p1_minWidth length+7*p1_minWidth:count*y_spacing+p1_minWidth ) ) dbCreateRect( pcCellView "TMP" list( length+6*p1_minWidth:count*y_spacing+p1_minWidth length+7*p1_minWidth:count*y_spacing+2*p1_minWidth ) ) if( (include_poly0!=nil) then dbCreateRect( pcCellView "POLY0" list( length+3*p1_minWidth-p0p1_enclosure:-gap*0.5-width_c-actuation-p0p1_enclosure length+7*p1_minWidth+p0p1_enclosure:count*y_spacing+p1_minWidth+p0p1_enclosure ) ) ) ; Create the instNamePrefix property dbReplaceProp( pcCellView "instNamePrefix" "string" "actuator" ) ; set version string dbReplaceProp( pcCellView "version" "string" "1.0.1" ) ; body SKILL code returns value t return(t) ) ; end of body-of-SKILL-code prog ) ; ; end of pcDefinePCell