Export Plot to CSV using SKILL
Creating Corners in maestro using SKILL
Hello,
I was looking in the maestro documentation for a command to create a corner in my test. I couldn't find creation, but rather only enabling/disabling:
maeSetSetup(?corners '("C0" "C1") ?variables '("VDD" "IREF")?enabled nil)
; Disables the C0 and C1 corners, and the VDD and IREF global variables
Is there a way to create a corner in maestro using SKILL?
Best regards,
Karam
Maestro cannot set analysis for test using SKILL
Hello,
I am having a problem with maestro.. I have the following code:
; create two maestro views
sessId1 = maeOpenSetup("myLib" "myCell" "maestro1")
sessId2 = maeOpenSetup("myLib" "myCell" "maestro2")
; create two tests for sessId1
maeCreateTest("myTest1" ?lib "myLib" ?cell myCell ?view "schematic" simulator "spectre" ?session sessId1)
maeCreateTest("myTest2" ?lib "myLib" ?cell myCell ?view "schematic" simulator "spectre" ?session sessId1)
; create one dc analysis for each test
maeSetAnalysis("myTest1" "dc" ?enable t ?options '(("saveOppoint" t)) ?session sessId1)
maeSetAnalysis("myTest2" "dc" ?enable t ?options '(("saveOppoint" t)) ?session sessId1)
; create variables for each test
maeSetVar("myVar" "myValue" ?typeName "test" ?typeValue '("myTest1") ?session sessId1)
; repeat for all myTest1 variables
maeSetVar("myVar" "myValue" ?typeName "test" ?typeValue '("myTest2") ?session sessId1)
; repeat for all myTest2 variables
; create analysis and variables for sessId2 here
; create outputs for sessId1 and sessId2, and save both sessions here
; simulate
maeRunSimulation(?session sessId1)
When executing the code, I get the following warning:
WARNING (ASSEMBLER-8065): Cannot set analysis because the specified test name "myTest1" does not exist...
WARNING (ASSEMBLER-8065): Cannot set analysis because the specified test name "myTest1" does not exist...
Funny enough, when simulating I get the following errors:
ERROR (ASSEMBLER-1707): Cannot run simulation because no analysis has been enabled for the test "myTest1"..
ERROR (ASSEMBLER-1707): Cannot run simulation because no analysis has been enabled for the test "myTest2"..
When opening the views in GUI, the analysis is not there, but the variables and outputs are defined.
I would also point out that everything worked perfectly well when I was working with only one session.
Update: I moved sessId2 = maeOpenSetup("myLib" "myCell" "maestro2") under the maeSetAnalysis(...) commands and I no longer get the error. It seems like maeSetAnalysis(...) ignores the "?session sessId" input
Best regards,
Karam
let-statement including hiDisplayForm
Hello,
in this example on support.cadence.com is shown how a form with an editable ReportField can be created. Within the procedure CCSEditReportForm() the form gets displayed , using the command hiDisplayForm(form). When I put CCSEditReportForm() in the CIW the form will pop up. I observed that both local parameters reportField and form of procedure CCSEditReportForm() - which are included in a let statement - are global. For instance when the form is visible and i put reportField in the CIW I get e.g. reportStruct@0x21a26b48 as a return value.
My expectation would be that reportField shouldn't be globally visible since it's included in the let statement ?!
Many thanks.
Kind regards,
Matthias
ADE-L/Spectre Sensitivity Analysis Form - is it possible to change the list of outputs using Skill?
Hi *,
Is there an API in skill to change list of the outputs for 'sens analysis, to have it immediately visible in the session form?
I have the list of outputs stored in some external file and I want to add them in some already open session .
I have access to the sessionId object, virtuoso v6.1.5+
Thank you,
Marcel
DIVA ivDRC() return message
How can I get an exact BBox from lower level to top?
Hi there,
I'd like to get a BBox from layout mixed with instances and mosaics hierarchically to top level. It has various order; inst -> mosaic -> inst or mosaic -> inst ->mosaic -> inst
It seems dbGetHierPathTransform only gives an exact coordinate when the layout is made of instances hierarchically.
I have no idea now how I could approach this issue.
Looking forward your advice.
Thanks,
Jungyoon
Failed to load icon file while loading toolbars
Hi,
I'm looking for solution for this error
\w *WARNING* (DEBASE-102205):_deCreateToolbarItems: Invalid iconFile "/projects/..../toolbars/icons/gravity-nexus.png" in action item "Snap to nexus". Make sure iconFile exists.
I have created a Layout.toolbar file under ~/.cadence/dfII/toolbars/byApplication/Layout.toolbars. If I provide the absolute path for the icon file, it loads safely. When I provide a relative path or a link to icon file, then it fails to load. I also tried using simplifyFilename("relative path to icon file") in the Layout.toolbars file. Surprisingly, the link given to simplifyFilename is expanded properly and yet fails to load the icon file.
Version used: @(#)$CDS: virtuoso version ICADV12.3-64b 01/24/2018 13:05
-Ramakrishnan
Comparing list of lists
Hi Team,
I had a list of lists like ll1=(("a" "3") ("b" "2") ("c" "4") ("d" "2") ("f" "1"))
ll2= (("d" "3") ("a" "3") ("g" "1") ("b" "3") ("f" "1") ("y" 2") ("z" "6"))
while comparing those list of lists for the availability of characters and numbers, i am not able to use break statements in foreach loops to break corresponding loop. Could you please help me in my code??
foreach(char1 ll1
value=0
foreach(char2 ll2
if(car(char1)==car(char2) && cdr(char1)==cdr(char2) then
value=1) ;I dont have any breaks statements in SKILL to use once the character is available and break the loop here
if(car(char1)==car(char2) && cdr(char1)!=cdr(char2) then
value=2) ;I dont have any breaks statements in SKILL to use once the character is available and break the loop here
if(car(char1) != car(char2) then
value=2) ;I dont have any breaks statements in SKILL to use once the character is available and break the loop here
) ;inner foreach loop
if(value==1 then printf("character is available and repetitions matched for %L\n" car(char1))
else
if(value ==2 then printf("character is available but repetitions mismatched for %L\n" car(char1))
else
if(value == 3 then printf("character not available %L\n" car(char1)))))
) ;outer foreach loop
pin information
hi Team,
I had a list with some pins of layout.
I need to find those pin info of layout(only corresponding hierarchy and no need of lower instances) of the list like pin coordinates and pin layer. I tried using dbFindTermByName but its not taking names of the lists as input.
In those some pins might be repeated. So need co ordinates of all the locations.
Could you please help me in coding this?
pin1 layer co-ordinates
pin2 layer co-ordiantes
....
determine if an object is part of a ROD
Is there a clean way to tell if a shape in a cellview is part of a ROD (actually MPP is what I'm interested in but other forum answers talk about that piece).
foreach(fig cv->shapes
when(shape_is_part_of_rod(fig) ;; <--- any simple way to do this?
printf("I am a %L that is part of a ROD\n", fig->objType)
)
)
I can picture some crazy things like making a table that I populate with all shapes by iterating on RODs and then subShapes and then see if a given figure ID is found in that big table but that seems like a lot of work for a simple check.
Thanks
-Dan
How to embed alphanumeric layer names in OASIS files?
Some say these fantsy pantsy OASIS files support alphanumeric layer names, like "RX" or "POLY", in addition to the usual layer and data type numbers. (I also see that the OASIS standard supports something called a "LAYERNAME" record...,)
So has anyone ever successfully embedded alphanumeric layer names into an OASIS file using Virtuoso XOasis Out?
It sounds like a useful feature, to have the Virtuoso layer/purpose names saved in the file, but I could not figure out how to get them in there! Nothing in the GUI (especially the "Layers" tab) seems to support this functionality. Maybe it's not yet implemented?
hiRegTimer is not calling my procedure
Hi all,
I'm trying to use hiRegtimer to pause my code without blocking my virtuoso session
my code:
procedure(yhwDeleteLabel(yhwText)
let((yhwCV yhwLabel)
yhwCV = geGetWindowCellView()
yhwLabel = setof(l yhwCV~>shapes l~>theLabel==yhwText && l~>track)
if(yhwLabel then
dbDeleteObject(car(yhwLabel))
)
)
)
yhwText = "netA"
hiRegTimer("yhwDeleteLabel(yhwText)" 10)
it never go inside my procedure. if I call yhwDeleteLabel(yhwText) without hiRegTimer then it works. What is wrong in my code.
I also tried to use ipcsleep() but it block my virtuoso session.
the purpose of the code was to show an info message in the layout session then disappear after 1 second display.
Thanks
layout object purpose number directly?
if I have an ID for a layout shape, a "rect" for example, I can get the layer number directly with
printf("Layer number = %u\n" fig->layerNum)
But to get the purpose number it seems I have to use
printf("Purpose number = %u\n" techGetPurposeName(tech, fig->purpose))
Is there a way to directly get the purpose number without invoking the tech file? Similarly, for an MPP there doesn't seem to be a way to directly get at the purpose *or* layer number without going through the tech file.
But... I was looking at transferring some layouts from one technology to a different one where the layer numbers and purposes numbers are all different and may or may not have the tech lib for both the old and new technologies loaded at the same time. For schematics, I just copy in unix-land (with tar) and then remaster all of my PDK instances and refer to a table that maps properties over and triggers callbacks, etc. That seems to be working fine (yay for graphically compatible symbols). On the layout end I was going to do a similar thing (copy in unix-land, and then fix with skill code). But I'm stuck on finding out the purpose number on shapes without invoking tech files which may or may not actually be accessible from the virtuoso session which is trying to fix up the layers. What I had envisioned originally was something like
foreach(fig cv~>shapes
old_lpp_nums = list(fig->layerNum, old_purpose_num) ;; but how to get old_purpose_num?
new_lpp_nums = conversion_table[old_lpp_nums]
fig->layerNum = car(new_lpp_nums)
fig->purpose = techGetPurposeName(tech_new, cadr(new_lpp_nums)) ;; would have been nice to have a ->purposeNum
)
to make matters worse, MPPs don't seem to give access to the layer number or purpose number in the subPart definition:
rodGetObj(fig)~>subParts~>layer ;; is a string unless the layer is not defined in the tech file, then a number
rodGetObj(fig)~>subParts~>purpose ;; is a string unless the purpose is not defined in the tech file, then a number
so that translation looks like checking if I get integers or strings and if strings then use the new tech file to convert to numbers, then convert numbers with the old to new table, then convert back to strings with the new tech file. Seems messy at best.
Am I asking for problems by allowing two different PDK libraries to exist in my cds.lib at the same time (what it would take I think to be able to gain access to both the old and new technologies simultaneously).
Maybe I should be using stream map files or even PVS so I can do logical operations if needed instead of directly fixing with skill code.
Thanks for any tips or pointers.
-Dan
Inconsistency in maestro result DB using SKILL
Hello,
I have two maestro views from which I extract my outputs using SKILL. Each view is in a different virtuoso version. The SKILL code used is the same in both versions:
; get session Id
sessId = maeOpenSetup(myLib myCell "maestro")
; get result DB
resDB = maeReadResDB(?historyName myHistory ?session sessId)
; select one arbitrary point and corner
point = resDB->points()
corner = point->corners()
; iterate tests and outputs
foreach(test corner->tests()
foreach(output test->outputs()
; evaluate wave outputs
when(output->value == "wave" myWave = calcVal(output->name test->name)
print(myWave)
)
)
)
This works for one version of virtuoso and extracts the waves of all tests and corners across all points and corners. The other version has two problems:
- Outputs of only one test can be accessed using a single point (i.e. outputs are separated throughout the points)
- print(myWave) prints nil. In the maestro GUI I am able to view the plots without any problem
Is there a way to make both versions behave the same (e.g. an environment variable?). Any help would be appreciated.
Best regards,
Karam
reading sens1 values from dcOpSens is very slow
Hi *,
I'm trying to read some data from a dc sensitivity analysis.
For now I have two nested foreach loops something like
foreach(refSig refSigList
foreach(instName instDataTable
// some code
sensVal = getData(strcat("sens1:" refSigSim "," instName ":dc") ?result "dcOpSens")
// some code
)
)
But it is very slow, for 2 X 1838 combinations it takes ~22seconds shown in profiler. And most of it > 21seconds is spent in getData().
Is there other faster method to get this data?
What I've noticed is that from VIVA results browser if I'm generating the table with all signals and associated values it is much faster , less than 14 seconds.
Best Regards,
Marcel
net, terminal, signal
Hi,
I'd like to change label names including pin names after selecting labels and pins that I want to change.
A skill code changing text is done but I should add more lines to change pin names as well because we are using layout XL.
I started to think what affects connectivity of layout XL, terminal name or pin name or net name and I'm not sure but I thought terminal name could.
Now I am having trouble to change terminal name of pin and I am confused about net, terminal and signal.
I have seen net and signal and terminal while writing skill codes but I don't have confidence on these.
1) If I am right that terminal name affects connectivity of layout XL, how can I change terminal name?
The way I am approaching is like this below.
foreach(sel selectedSet()
if(sel~>objType =="rect" then
t_netName = sel~>net~>name
d_termID = dbFindTermByName(cv t_netName)
.
.
d_termID~>name = t_changed
);foreach
2) Can you explain what's the difference of net, terminal and signal?
Thanks,
Jungyoon
how to automatically select the content of a field when a form appears?
Hi all,
I have create a form using hiCreateAppForm(), and when the form was invoked, the cursor will automatically focus on the first editable field, but will not select the content of that field.
I want to make the select automatically, so I can change the content directly by using keyboard. Is there any ways to implement it?
Another question: Is there any ways to remove the “Help” button from the form?
Regards,
Dave