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;
}





