004_callback : PCell callback function example
Minimum Required Version: Expert 4.10.39.R
Expert PCell parameters support callback functions written in JavaScript. It is very useful for reflecting internal expressions for L, W, R, and C parameters of resistors and capacitors.
This example will show how to add/execute a callback function in PCell parameters.
1.0. Preliminary steps to start example
- Run the Expert application
- Load the "scripting_ex04.eld" project
1.1. Checking the PCell Scripts for callback
All types of PCells (LISA, JavaScript) may have a callback.
Open the "RPPLUS" cell, then a Script panel for RPPLUS will appear automatically. This PCell is created using JavaScript, and requires a "callback:" keyword for callback in definePCellParams.
Open the "P1P2CAP" cell, then a Script panel for P1P2CAP will appear automatically. This PCell is created using LISA, and requires a "set_pcell_callback" function in the BODY block.
1.2. Loading the callback JavaScript
To open the script window, select Tool->Script->Script Panel . From within the script window, choose File->Open and select the file callback_func.js.
This script will set up the following sub functions for the PCell callback:
- RPPLUS_callback: for the RPPLUS PCell
- PIP_callback: for the P1P2CAP PCell
- IND_callback: for the IND PCell
Callback scripts must be written in JavaScript only.
Callback script calculates R, L, and W based on R=Rsh*L/W, and L, EachL and Strips based on EachL=L/Strips, where:
- R: Resistor value
- L: Length of the resistor
- W: Width of the resistor
- Strips: Number of series segments of the resistor
- EachL: Length of each segment
1.3. Trying the callback functions
Open the "pcell_callback" cell as in pcell_callback_layout.png . Select the RPPLUS PCell in the layout as in rpplus_layout.png .
Change the R, L, W, EachL, and Strips parameters in the Property Bar one at a time. Other related parameter values will be updated according to the expressions in the callback function when you change active parameter in the Property Bar window.
callback_func.js.txt
//////////////////////////////////////// ////// for RPPLUS Pcell callback /////// //////////////////////////////////////// function RPPLUS_callback(params){ var W = params.W.value; var L = params.L.value; var R = params.R.value; var Strips = params.Strips.value; var EachL = params.EachL.value; var Rsh = 200; if(params.W.changed){ R = Rsh*L/W; } if(params.L.changed){ R = Rsh*L/W; } if(params.R.changed){ L = R*W/Rsh; } if(params.Strips.changed){ EachL = L/Strips; } if(params.EachL.changed){ Strips = Math.round(L/EachL); EachL = L/Strips; } W=Math.round(10*W)/10; L=Math.round(10*L)/10; R=Math.round(10*R)/10; EachL=Math.round(10*EachL)/10; params.W.value = W; params.L.value = L; params.R.value = R; params.EachL.value = EachL; params.Strips.value = Strips; } //////////////////////////////////////// ////// for P1P2CAP Pcell callback /////// //////////////////////////////////////// function PIP_callback(params){ var W = params.W.value; var L = params.L.value; var C = params.C.value; var Entry = params.Entry.value; var Ca = 0.0075; //C area pF/um^2 var Cp = 0.00625; //C peri pF/um if(Entry == "L_W"){ if(params.W.changed){ C = Ca*L*W+Cp*2*(L+W); } if(params.L.changed){ C = Ca*L*W+Cp*2*(L+W); } } else if(Entry == "C_L"){ if(params.L.changed){ W=(C-2*Cp*L)/(Ca*L+2*Cp); } if(params.C.changed){ W=(C-2*Cp*L)/(Ca*L+2*Cp); } } else if(Entry == "C_W"){ if(params.W.changed){ L=(C-2*Cp*W)/(Ca*W+2*Cp); } if(params.C.changed){ L=(C-2*Cp*W)/(Ca*W+2*Cp); } } else if(Entry == "C"){ if(params.C.changed){ L=(Math.sqrt(Cp*Cp+Ca*C)-2*Cp)/Ca; W=L; } } W=Math.round(10*W)/10; L=Math.round(10*L)/10; C=Math.round(10*C)/10; params.W.value = W; params.L.value = L; params.C.value = C; } ///////////////////////////////////// ////// for IND Pcell callback /////// ///////////////////////////////////// function IND_callback(params){ var radius = params.radius.value; if(params.radius.changed){ if(radius < 20){ radius=20; // display("too small "&radius&" radius must be over 20um"); } } params.radius.value = radius; }