Quantcast
Channel: Cadence Custom IC Skill Forum
Viewing all 5076 articles
Browse latest View live

warning of Acde in Cadence Virtuoso

$
0
0

Hello Sir,

I am Anum Khan i am working on a project of designing a Low Power Low Noise Op-amp on Cadence Virtuoso version IC6.1.5.500.12

when i run the simulation it gives the warning of 'Acde' = 240.24e-03 is unusually small.

Can you please explain what does Acde means and how can i fix it ?

Thank You

Best Regards,

Anum Khan


How to automatically store technology version on instance in schematics and layout?

$
0
0

Hi,

I'd like to store the version number of the PDK on an instance when this instance is instantiated in schematic or layout. I need this in order to be able to check with which version of the PDK a particular design has been made. Later, I will create a script that hierarchically checks all instances of a given design, and reports the used versions. This will then be a script run at tape-out to ensure all devices are generated with the correct (latest) PDK version.

It could be done by adding a parameter with the version number as value to the CDF, like this:

cdfCreateParam( cdfId
        ?name           "PDK_version"
        ?prompt         "PDK Version"
        ?defValue       "x.y.z"
        ?type           "string"
        ?display        "t"
        ?editable       "nil"
        ?storeDefault   "yes"
)

However, if the PDK gets updated, the version number will be increased, which would mean, with this implementation, that the CDF of all cells in the library have to be updated to the new version. Of course, this could be automated, but i would like to use a different approach.

The version of the PDK which is loaded in Virtuoso is stored in an environment variable called TECH_VERSION. It can be retrieved by doing:

getShellEnvVar( "TECH_VERSION" )

What I would like to happen is that when the instance is instantiated, the value of TECH_VERSION is automatically stored in the CDF parameter PDK_version. Something like this doesn't work:

cdfCreateParam( cdfId
        ?name           "PDK_version"
        ?prompt         "PDK Version"
        ?defValue       "getShellEnvVar( \"TECH_VERSION\" )"
        ?type           "string"
        ?display        "t"
        ?editable       "nil"
        ?storeDefault   "yes"
)

This would simply put the text "getShellEnvVar( "TECH_VERSION" )" as value in the "PDK_version" field.

An other solution could be by putting some code in a call-back procedure that puts the version number in the parameter value. However, this only works when this call-back procedure is triggered. If a default device is instantiated, with no modifications to its parameters, the call-back will not be triggered, thus the version number will not be set.

So, I think this has to be a post-instantiation trigger. And I don't know how to do that properly. Any help is highly appreciated.

If an other solution is possible, I would surely like to know that as well.

Thanks in advance.

With kind regards,

Sjoerd

Accessing and modifying toolbar items in IC616

$
0
0

Hi,

Problem 1:

I have followed the Solution Article 11478824  to create a toolbar in layout window. Now I need to access the items of toolbar and I have used hiGetToolbarObjName function to do that. But I'm looking for a generic way to access the items something like this

csToolbarGetElement(element) ;;;;;where element is a string which points to one of the toolbar item

csToolbarGetElement(element)~>value ;;;;;should return the value of the element

Problem 2:

I have created few subActions and a comboFiled to list the subActions. Whenever I select any subAction, I need to change the icon of the comboFiled. For example, I'm looking for a implementation similar to Options Toolbar -> Edit Snap Mode in layout window. Whenever I change the snap mode, the icon of the combo file changes notifying the user the present mode.

Please free to ask question in case I have not explained my need clearly.

Thanks

Ramakrishnan

How to correlate two parameters in an optimization run?

$
0
0

Hi all,

I need to optimize the size of a clamping diode. I can edit its area and perimeter. These two parameters are of course correlated. One option to run the optimization is to create a variable X and introduce expressions for area and perimeter as follows:

Area: X^2; Perimeter: 4*X

Then give a range for X and let the optimizer do its work. However, I wonder if it is possible to correlate the parameters of the instance without creating a variable, which allows me to optimize without having to edit the schematic. If let's say, I give a range for the perimeter, is it possible to define the area as (perimeter/4)^2 and run the optimization? What would be the syntax to use?

Thanks in advance.

Lucho

version: Virtuoso IC6.1.6-64b.500.11.EHF2051.

skill code to find out VIA coordinates from given layout

$
0
0

Hi,

Can someone tell me skill code to extract VIA locations from given layout ? e.g I have metal 5 and metal 6 in my layout and i m mainly interested in knowing VIA5 locations. Is there skill code to get this ?

Problem selecting an error marker

$
0
0

Hi,

I'm trying to instantiate a pcell from technology library which is provided by foundry. Few pcells are not supported by foundry at present moment. So, an error marker is being created with description "currently not supported by foundry" for such cells. Now, I'm instantiating pcell using dbCreateInst(). Is there a way I can identify that, this pcell is not supported by foundry, using skill? I'm unable to select that marker to obtain it's properties.

Thanks,
Bala

Nested cyclic fields in two dimensional form

$
0
0

Hello everyone,

I wan wondering if it's possible to attach cyclic fields to one choice in another cyclic field? I mean like having a cyclic field with different choices, one of these choices has an arrow that leads to another cyclic field with different choices?

Thanks,

Sherif

Issue in script to modify a routing blockage in Cadence SKILL

$
0
0

I created 2 procedures in SKILL 

The first takes 2 points "for ex: list(x:y)" and take a list of points returned by the command blockage_id~>points, and tries to find if those 2 points found on the returned list.. 
findPointsInList(pt1 pt2 ptList) .. returns 1 if successful or 0 otherwise 

The second procedure uses the first one in its "if" condition, but it doesn't work, which is illogical to me!! 

Hint: the many println() usages is for debugging. 

Code: 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 


;; Globals 
deltaX = 0.02 
deltaY = 0.02 
offset = 0.02 
cutWidth = 0.16 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

procedure( updateBlockage(id pts) 

prog( 

list1 list2 list3 list4 x1 y1 x2 y2 x3 y3 x4 y4 rectId idBlkgMetal1 blkgPointList vartop varbottom 
x3TopBlkg y3TopBlkg x33TopBlkg y33TopBlkg x4TopBlkg y4TopBlkg x44TopBlkg y44TopBlkg 


vartop = 0 
varbottom = 0 
list1 = list() 
list2 = list() 
list3 = list() 
list4 = list() 
blkgPointList = list() 

arr=listToVector(pts) 
list1 = arr[0] 
list2 = arr[1] 
list3 = arr[2] 
list4 = arr[3] 
pts=vectorToList(arr) 

x1 = car(list1) 
y1 = car(cdr(list1)) 
x2 = car(list2) 
y2 = car(cdr(list2)) 
x3 = car(list3) 
y3 = car(cdr(list3)) 
x4 = car(list4) 
y4 = car(cdr(list4)) 

idBlkgMetal1 = id 
blkgPointList = idBlkgMetal1~>points 




;;;;;;;;;;;;;; 
;Top blockage; 
;;;;;;;;;;;;;; 
x3TopBlkg = x3 + deltaX 
y3TopBlkg = y3 + deltaY 
x4TopBlkg = x4 - deltaX 
y4TopBlkg = y4 + deltaY 

x33TopBlkg = x3TopBlkg + offset 
y33TopBlkg = y3TopBlkg + cutWidth 
x44TopBlkg = x4TopBlkg - offset 
y44TopBlkg = y4TopBlkg + cutWidth 


;println("x3TopBlkg=") 
;println(x3TopBlkg) 
;println("y3TopBlkg=") 
;println(y3TopBlkg) 
;println("x4TopBlkg=") 
;println(x4TopBlkg) 
;println("y4TopBlkg=") 
;println(y4TopBlkg) 
;println("==========") 

  ;;Top Blockage 
  
  vartop = findPointsInList(list(x3TopBlkg y3TopBlkg) list(x4TopBlkg y4TopBlkg) blkgPointList) 
  println("vartop = ") 
  println(vartop) 

  when(  equal( vartop 1 )   

                println("Hi from top!") 

                leChopShape( idBlkgMetal1 list(x33TopBlkg:y2 x33TopBlkg:y33TopBlkg x44TopBlkg:y44TopBlkg x44TopBlkg:y1) t t 10 ) 

                procedure(myFilterProc(objId) 
                if(objId~>objType=="rect" t nil) 
                ) 
                rectId = gePointQuery( hiGetCurrentWindow() x3:y3 "myFilterProc") 
                leStretchShape( rectId list( 0 cutWidth ) 
                list(nil t t nil) t ) 

                leStretchShape( rectId list(offset 0) 
                list(nil nil t t) t ) 

                leStretchShape( rectId list(-offset 0) 
                list(t t nil nil) t ) 
                                                 
        );when 


);prog 
);proc 



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

procedure( findPointsInList(pt1 pt2 ptList) 
        prog( (pt1found pt2found flag1 flag2 sum cond1 cond2 cond3 cond4 cond5 cond6) 

                sum = 0 
                pt1found = 0 
                pt2found = 0 
                flag1 = 1 
                flag2 = 1 
                cond1 = 0 
                cond2 = 0 
                cond3 = 0 
                cond4 = 0 
                cond5 = 0 
                cond6 = 0 
         
                ;println("pt1found =") 
                ;println(pt1found) 
                ;println("pt2found =") 
                ;println(pt2found) 
                ;println("sum =") 
                ;println(sum)         


                foreach( pt ptList 
                        ;println("pt =") 
                        ;println(pt) 
                        ;println("pt1") 
                        ;println(pt1) 
                         
                        cond1 = equal(flag1 1) 
                        cond2 = equal(float(car(pt)) float(car(pt1))) 
                        cond3 = equal(float(car(cdr(pt))) float(car(cdr(pt1)))) 

                        cond4 = equal(flag2 1) 
                        cond5 = equal(float(car(pt)) float(car(pt2))) 
                        cond6 = equal(float(car(cdr(pt))) float(car(cdr(pt2)))) 

                        ;println("Blkg pt") 
                        ;println(pt) 
                        ;println("pt1 ") 
                        ;println(pt1) 
                        ;println("pt2") 
                        ;println(pt2) 
                        ;println(cond1)                                                 
                        ;println(cond2)                                                 
                        ;println(cond3)                                                 
                        ;println(cond4)                                                 
                        ;println(cond5)                                                 
                        ;println(cond6) 
                        ;println("=========") 
                                                 
                         
                        when( cond1 && cond2 && cond3 
                                                ;println("I am section 1!") 
                                                pt1found = 1 
                                                flag1 = 0 
                        ); 
                         
                        when( cond4 && cond5 && cond6 
                                                ;println("I am section 2!") 
                                                pt2found = 1 
                                                flag2 = 0 
                        );when4 
                                                 
                                                 
                );foreach 

                sum = pt1found + pt2found 
         
                ;println("after evaluation:") 
                ;println("pt1found =") 
                ;println(pt1found) 
                ;println("pt2found =") 
                ;println(pt2found) 
                ;println("sum =") 
                ;println(sum)         

                 
                if( equal( sum 2) then 
                        return(1) 
                else 
                        return(0) 
                );if         

                 

        );prog 
);proc 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

I hope someone helps me. 

Thank you! 
Abdullah 


skill code to generate pin list

$
0
0

Hi,

I have a cadence layout with lots of pins at different locations. I want to generate a list of the pins, ideally with the following information

pinname, location (X,Y coordinates), pin layer.

The pins are all in rectangular shapes, so ideally I want the locations of the center of those rectangulars.

Is this doable by using existing Layout or Layout XL commands, or by using skill?

I found some information to print a list of the labels from the following post, but could not get the file generated. nothing happens when I load the skill code :(

https://community.cadence.com/cadence_technology_forums/f/48/t/27295

Sorry that I am a circuit designer and not very familiar with SKILL, any help is highly appreciated.

Thank you!

Under the hood memory management, w/o Garbage collection.

$
0
0

Hello all. Let us say that I have this (simplistic) code:
a=list( 1 2 3 4 5 6 7 8 )
a=car(a)
b=list(2 3 4)
The question is this: assuming that no "proper" garbage collection has been done. I.e., if the next command after b=list(1 2 3) will be gc(), memory footprint will change.
What happens is that a now takes far less space than it did in the past. Now b consumes more memory.
What will the SKILL engine do?

1. allocate more memory to contain variable b, and subsequent memory requiring
2. It will it use the memory release, after variable a needs less space, and garbage collection will simply relieve any excess memory?
My guess would be that  item 1 will happen.

Thanks.

Parasitic Report-NS/NA values

$
0
0

Hi,

We are using IC6.1.6-64b 64-bit, MMSIM 13.1
I tried using parasitic report for the extracted view of my circuit. I followed all the guidelines and read the parssim document. Then I run DC simulation and was looking for the R parasitics.

When I look at the schematic, some nodes have the reported R, and some have only NS and NA. I looked at CIW and it shows this message:

"*WARNING* (PARA-704) Effective R calculation has ignored the current and power from one or more parasitic resistors on net /I1940/Q1_H, as the resistor current was too low. Such currents are numerical noise from the simulator convergence algorithm and can consequently generate unreliable values. Decrease the simulator options "iabstol" and "vabstol" to reduce noise and provide a more accurate current through the resistor. If the currents are known to be accurate, you can modify the environment setting "mspsAv.currentThresholdScale" to change the multiplication factor applied to "iabstol" when checking for low currents."

I tried decreasing "iabstol" and "vabstol" values to the extent for some values it takes 3 hours to perform DC simulation, and for some "iabstol" and "vabstol" values the simulator does not converge anymore. I wonder is there any way to get parasitic resistance for all nodes. By the way, I didn't know how to change the environment setting "mspsAv.currentThresholdScale", and I am not sure if that would help or not.

Ps.: I just noticed I didn't post my question in the right section, but I cannot move it anymore :(

Any help will be appreciated.

segmentation fault error when code running

$
0
0

Hi every one,

I wrote a script to generate many files, but when the script finished, the icfb showed the error information: segmentation fault, and crashed.

I tested the script in IC51 and IC61, both crashed.

Please help me to find the problem out, thank you very much!!

the codes:

procedure(LeeSrcLibGen(pdk bodyList metalList targetPath)
prog((contName metalLength a i metalOpt totalList metalProcess contPath ipcId num cellPath viewFile port envFile)

contName=strcat(pdk "_" "srcLibs")
unless(isDir(targetPath) && isWritable(targetPath)
printf("path is not available: %L \n" targetPath)
return()
)
printf("\n**************************************************\n
\n The Directory has been created.\n
\n Ready to generate.\n
\n**************************************************\n")
ipcId=ipcBeginProcess(strcat("rm -rf " targetPath "/" contName))
ipcWait(ipcId)

metalLength=length(metalList)
a=1
foreach(metal metalList
metalProcess=car(metal)
metalOpt=remove(metalProcess metal)
totalList=append(bodyList metalOpt)

contPath=targetPath
foreach(context list(contName metalProcess "libdefs" pdk)
contPath=strcat(contPath "/" context)
ipcId=ipcBeginProcess(strcat("mkdir " contPath))
ipcWait(ipcId) ) ;foreach

num=length(totalList)
i=1
foreach(cell totalList
cellPath=strcat(contPath "/" cell)
ipcId=ipcBeginProcess(strcat("mkdir " cellPath))
ipcWait(ipcId)
viewFile=strcat(cellPath "/" "schematic.view")
setq(port outfile(viewFile))
when(port
fprintf(port "%L %L \n" pdk cell) ) ;when

close(port)
printf("%n-->Generating %L (%n/%n) --- %L \n" a metalProcess i++ num cell )
hiFlush()

) ;foreach
a++
) ;foreach

printf("Done...\n")
) ;let
) ; procedure


pdkName="testPDK"

bodyList=list(
"nmos18" "nmos33" "nmos18_ckt" "nmos33_ckt" "pmos18" "pmos33" "pmos18_ckt" "pmos33_ckt"
"nmos18_nw" "nmos33_nw" "nmos18_nw_ckt" "nmos33_nw_ckt" "pmos18_nw" "pmos33_nw" "pmos18_ckt_nw" "pmos33_nw_ckt"
"rnplus" "rpplus" "rnplus_sab" "rpplus_sab" "rnwell_aa" "rnwell_sti"
"rnpoly" "rppoly" "rnpoly_sab" "rppoly_sab" "rhr"
"rnplus_ckt" "rpplus_ckt" "rnplus_sab_ckt" "rpplus_sab_ckt" "rnwell_aa_ckt" "rnwell_sti_ckt"
"rnpoly_ckt" "rppoly_ckt" "rnpoly_sab_ckt" "rppoly_sab_ckt" "rhr_ckt"
)

metalList=list(
'("All" "rm1" "rm2" "rm3" "rm4" "rm5" "rm6" "rm6_ckt" "rm6t" "rm6t_ckt")
'("metalA" "rm1" "rm2" "rm3" "rm4" "rm5" "rm6")
'("metalB" "rm1" "rm2" "rm3" "rm4" "rm6")
'("metalC" "rm1" "rm2" "rm3" "rm6")
'("metalD" "rm1" "rm2" "rm6")
'("metalE" "rm1" "rm2" "rm3" "rm4" "rm5" "rm6_ckt")
'("metalF" "rm1" "rm2" "rm3" "rm4" "rm6_ckt")
'("metalG" "rm1" "rm2" "rm3" "rm6_ckt")
'("metalH" "rm1" "rm2" "rm6_ckt")
'("thickmetalA" "rm1" "rm2" "rm3" "rm4" "rm5" "rm6t")
'("thickmetalB" "rm1" "rm2" "rm3" "rm4" "rm6t")
'("thickmetalC" "rm1" "rm2" "rm3" "rm6t")
'("thickmetalD" "rm1" "rm2" "rm6t")
'("thickmetalE" "rm1" "rm2" "rm3" "rm4" "rm5" "rm6t_ckt")
'("thickmetalF" "rm1" "rm2" "rm3" "rm4" "rm6t_ckt")
'("thickmetalG" "rm1" "rm2" "rm3" "rm6t_ckt")
'("thickmetalH" "rm1" "rm2" "rm6t_ckt")

)

targetPath="./"

hiDisplayAppDBox(?name 'LeeSrcNoticBox

?dboxBanner "information"
?dboxText "It will create src library"
?dialogType hicErrorDialog
?dialogStyle 'modal
?buttonLayout 'YesNo
?callback sprintf(nil "LeeSrcLibGen('%L '%L '%L '%L)" pdkName bodyList metalList targetPath)
)

Hierarchically Layer generation

$
0
0

Hi,

I am using the script CCShierLayerOpsSel.il for Layer generation, and it is working absolutely fine, to get the data hierarchically and generate layer.

But it is generating the new layers only at the top level. Is it possible to generate the layers in different hierarchy level, wherever it will match the condition?

That way if it is the case of adding lvt, hvt etc layers, mainly the device specific layers, that can resolve the hierarchical LVS issues also.

Please provide the solutions for the same.

Thank you for the support.

Regards,

Subhabrata 

Accessing cellview ID which is stored as a string

$
0
0

Hi,

I'm into a situation now that I have stored a database ID (cellview or object ID) as a string. Like this

a = sprintf(nil, "%L" geGetEditCellView())

b = sprintf(nil, "%s" car(geGetSelSet()))

Now I am trying to access the cellview ID through the variable a or b as follows

evalstring(a)~>cellName

evalstring(b)~>width

Evalstring does not work here. Is there any other function which can do this job?

Why am I doing this?

Say I want to store some layout objects ID inside a report field along with other information. And when user clicks any row in the reportField, the CB should be able to zoom to that particular object.

Is this is a right approach or are there any other elegant way of doing this?

Thanks

Ramakrishnan

Purpose of rodCoord functions

$
0
0

Hello,

What exactly is the role of the rodCoord functions? I have gone through the documentation about them, but it seems rather complicated to grasp their usage in real-life scripts, due to the fact that the documentation is not clean enough. It seems that the rodCoord functions are designed for coordinates of shapes, but their usage is somehow abstract. 

So, can you give me some examples in which the usage of rodCoord is more advantageous than using other functions of rounding or snapping to a predefined value such as fix2?

Thank  you,

Elena


How to create a CDF parameter for your custom model parameter added to the foundary's model file copied locally?

$
0
0

Hi, 

I first wanted to manually adjust the Vth0 of the nch and pch transistors from the foundry's (tsmc65nm) model file (*.scs). Therefore, I copied their model file locally and added its location to my model library. Then, I was able to change the vth0 for a given transistor manually by editing the model file and it does reflect in the simulation. Because I want to assign different vth0 for each transistors, I don't want to have different model file for each transistors (as it would be very tedious). Therefore, I want to introduce my own parameters mydvthn and mydvthp for nch and pch (i.e vth0 = abc mV + mydvthn),  vice-versa in the model file and then assign different values for each instances of the transistors using CDF parameters associated with each transistor instances (which I don't know how to do). In other words, I want to keep only one local model library where I can have mydvthn and mydvthp parameters that I can adjust them using CDF parameter. 

I have tried creating my custom cdf parameters mydvthn, mydvthp (same names as the ones I added in the model file) but they are not reflected on my simulation. The interesting thing is that it works perfectly fine when I create a designvariable for the whole schematic and give them the same names, mydvthn and mydvthp. However, again, creating design variables would reflect in all transistors as they all point to the single model file which I don't want.

So, How do I create a CDF parameters mydvthn and mydvthp for my transistor instance? It only works if I create mydvthn and mydvthp as a design parameters.  My CDF parameter setup for mydvthn and mydvthp is following:

devault value : '0', parse as CEL : 'yes', parse as number: 'yes', editable condition: 't', units: 'voltage'

Cadence Version: 6.1.5-64b

Need Support for CCShierLayerOpsSel.il Create Layer Script.

$
0
0

Hi,

With the "GROW BY" Option, I want to verify if the 'outLayer' is already placed before with the reference of 'Layer1' (InputLayer).

Can we add that kind of condition?

As the script will start working Hierarchically, I want to stop the repetition of the same Generated layer, from different Hierarchy.

Please let me know the suggestions.

Thanks & Regards,

Subhabrata

Following Bus connections

$
0
0

Hello,

I am writing a skill script that allows the user to follow a net through the instances it is connected to and I am facing a problem regarding how to deal with buses.

Let's consider this schematic:

I have clicked on the net A<3:0>, which is a 4 bit bus, and I want to know how it is connected

(car (geGetSelSet))~>net~>?? tells me that it is connected to instances I5 and C0<3:0> only (I looked at allInstTerms and instTerms properties) but the signal field allows me to know how individual signals are connected

(caddr (car (geGetSelSet))~>net~>signals)~>name is A<1>

(mapcar 'car (caddr (car (geGetSelSet))~>net~>signals)~>memInstTerms)~>inst~>name tells me that A<3> is connected to these instances: C0<3:0> I5 I7

(mapcar 'car (caddr (car (geGetSelSet))~>net~>signals)~>memInstTerms)~>name tells me ("PLUS" "P1<3:0>" "P2<1:0>") so A<1> is connected to P1<3:0> on instance I5 and P2<1:0> on instance I7

now, I want to know on which input bit is A<1> connected to.

(mapcar 'cadr (caddr (car (geGetSelSet))~>net~>signals)~>memInstTerms) tells me (2 2 0) so I expect that A<1> connects to bit 2 (counting from 0) of P1<3:0>, which is P1<1> and to bit 0 of P2<1:0> which is P2<1>.

Is this reasoning correct? I need to know this because I need to follow A<1> on its path inside instances I5 and I7. Same for all other bits

Thank you and best regards,

Patrik

hiCreateReportField... passing arguments to its callback

$
0
0

I am using hiCreateReportField and choosing the argument ?callback to find out which row

has been selected. The callback (as shown in the documentation for hiCreateReportField)

function is automatically passed two arguments. The first argument is the field name, the

second argument is a list of integers representing the selected items in the report.

My question is... How can I pass additional variables to my callback function while

keeping the two arguments passed automatically (fieldName selectedItems)?

Cadence doc...

reportField = hiCreateReportField(

...other arguments...

? callback 'reportCB

)

procedure( reportCB(fieldName selectedItems "sl")
  printf( "Report field callback, fieldName = %L, selectedItems = %L"           fieldName selectedItems )
)

bindkey to move selected object

$
0
0

Hi All,

I want to create my own bindkey to use key 5/6/7/8 to move a select object left/right/up/down, and the moving distance is 0.005 upon each key-pressing.

eg, if I press key ‘5’, the selected(highlighted) object will move up 0.005, press ‘6’ will move it down 0.005, etc.

 

Currently in Virtuoso, we can only move the object by dragging the mouse.  But I’m used to use bindkey in other layout tools, and I want to do the same in Virtuoso.

 

I myself tried following , but it didn’t work (it always popped out Move window which I do not like) :

 

procedure( leMoveObj(deltx delty)

    leHiMove()

    le0MoveForm->moveXField->value=deltx

    le0MoveForm->moveYField->value=delty

    _leApplyDeltaCB(hiGetCurrentWindow())

)

 

hiSetBindKey("Layout" "<Key>5" "leMoveObj(-0.005 0)")

hiSetBindKey("Layout" "<Key>6" "leMoveObj(0.005 0)")

hiSetBindKey("Layout" "<Key>7" "leMoveObj(0 0.005)")

hiSetBindKey("Layout" "<Key>8" "leMoveObj(0 -0.005)")

Any suggestion ?

Thanks,

ManChak

Viewing all 5076 articles
Browse latest View live