dump ROD names

Discussion in 'Cadence' started by rick, Jun 1, 2010.

  1. rick

    rick Guest

    The pCell that Im working on has the option of multiple fingers on the
    devices. Im using RodCreatePath with pts
    and the first finger is getting connected but the additional fingers
    do not. I would like to find out the names of
    the additional fingers so is there a way to dump the ROD names instead
    of the dbxxx names?
     
    rick, Jun 1, 2010
    #1
  2. rick

    lokesh Guest

    Hi Rick,
    --Reg. the additional fingers not getting connected --- I also came
    across such an situation, I guess the following might help you
    (although they are too simple).
    *In my case, I had to write two separate skill codes to connect the
    fingers. This was because I was trying to manipulate the Pcells given
    by vendor instead of creating my own. So when the width of the Mosfet
    is too low - you basically get a dog bone structure instead of a
    rectangular one. As a result of which you have to change the spacing
    in your RodCreatePath command. I guess in your case this should be the
    problem.
    Also I was not getting the latter part of your message clearly.

    Regards,
    Lokesh
     
    lokesh, Jun 2, 2010
    #2
  3. rick

    rick Guest

    Hi Lokesh - I am using the devices from the fabs PDK. Im not getting
    errors so Im suspecting
    that the finger name is something other than what the code is looking
    for. The gate pin name is
    something like topG_1 and other kits that Ive worked with usally tacks
    on an extension like topG_1.1
    but this might be correct considering this kit. I found ROD commands
    to dump out device info but
    they are database ID's instead of the actual ROD name that would
    appear on the properties form.

    Rick
     
    rick, Jun 2, 2010
    #3
  4. rick

    lokesh Guest

    Hi Rick,
    If you are looking for the name of the ROD object.

    Try the following:
    ;;;;;;;;;;;;;Procedure defenition;;;;;;;;;;;;;
    procedure(getRODobj()
    cvId = deGetCellView()
    dbId = car(geGetSelectedSet(cvId))
    rodId = rodGetObj(dbId)
    );proc
    ;;;;;;;;;;;;;Procedure defenition;;;;;;;;;;;;;
    obj1=getRODobj()
    obj1~>name

    Regards,
    Lokesh
     
    lokesh, Jun 2, 2010
    #4
  5. lokesh wrote, on 06/02/10 07:22:
    Or simply:

    ; if you have an instance of the pcell that you want to look at the shapes for
    shapes=car(geGetSelSet())~>master~>shapes
    mapcar('rodGetObj shapes)~>name

    You'll get nil for any object which doesn't have a name, and the name for any
    that does.

    Regards,

    Andrew.
     
    Andrew Beckett, Jun 2, 2010
    #5
  6. rick

    rick Guest

    This worked worked...Thanks!!!....and it confirmed what I expected,
    the extra gate names
    are unique, not extensions.

    gate1 pin = "botGp_1" "topGp_1"
    gate2 pin = "botGp_2" "topGp_2"

    The code below works for a single gate connection ( I didnt write it
    and honestly do not fully understand it either).
    Is it possible to chop off the last character and make it a variable
    that the foreach would increment the number of
    times that is in the finger count variable which is already in the
    code. If there are 4 fingers, then it would go through
    this code 4 times and would connect botGp_1 then botGp_2 and so
    on.... Perhaps there is a better way????


    ;; create the input connections in Poly
    foreach((input tpair) list(in1Name in2Name) list(
    list(ngatel pgatel) list(ngater pgater))
    rodCreatePath( ?cvId cv
    ?name input
    ?layer list(polyLayer "drawing")
    ?width polyWidth
    ?pts list(getq(car(tpair) upperCenter)
    rodPointX(getq(car(tpair)
    upperCenter)):rodPointY(getq(cadr(tpair)
    lowerCenter))-
    rodPointY(getq(car(tpair) upperCenter))/2.0
    rodPointX(getq(cadr(tpair)
    upperCenter)):rodPointY(getq(cadr(tpair)
    lowerCenter))-
    rodPointY(getq(car(tpair) upperCenter))/2.0
    getq(cadr(tpair) lowerCenter))
    ); rodCreatePath for input connections

    ); foreach
     
    rick, Jun 3, 2010
    #6
  7. rick wrote, on 06/03/10 00:01:
    Rick,

    It would have helped if you'd shown what the values of in1Name and in2Name were.
    My guess is that the in1Name is the list of what you want the new ROD objects
    to be called, and that in2Name are a list of lists of rod objects? Each sublist
    in the second list is presumably a list of a the two rod objects you're routing
    between?

    Anyway, I think it's most likely that you wouldn't change this part of the code,
    but instead change how those lists (in1Name and in2Name) are generated. You
    didn't show that part of the code...

    Regards,

    Andrew.
     
    Andrew Beckett, Jun 3, 2010
    #7
  8. rick

    rick Guest

    Sorry!!!....Here are are the missing pieces.

    let((
    (in1Name "A")
    (in2Name "B")
    )

    ngatel = rodGetObj(sprintf(nil "ntranl/botGp_1" f_n_b-1) cv)
    ngater = rodGetObj(sprintf(nil "ntranr/botGp_1" f_n_a-1) cv)

    pgatel = rodGetObj(sprintf(nil "ptranl/botGp_1" f_p_b-1) cv)
    pgater = rodGetObj(sprintf(nil "ptranr/botGp_1" f_p_a-1) cv)


    ;; create the input connections in Poly
    foreach((input tpair) list(in1Name in2Name) list(
    list(ngatel pgatel) list(ngater pgater))
    rodCreatePath( ?cvId cv
    ?name input
    ?layer list(polyLayer "drawing")
    ?width polyWidth
    ?pts list(getq(car(tpair) upperCenter)
    rodPointX(getq(car(tpair)
    upperCenter)):rodPointY(getq(cadr(tpair)
    lowerCenter))-
    rodPointY(getq(car(tpair) upperCenter))/2.0
    rodPointX(getq(cadr(tpair)
    upperCenter)):rodPointY(getq(cadr(tpair)
    lowerCenter))-
    rodPointY(getq(car(tpair) upperCenter))/2.0
    getq(cadr(tpair) lowerCenter))
    ); rodCreatePath for input connections

    ); foreach

    Thanks

    Rick
     
    rick, Jun 3, 2010
    #8
  9. rick wrote, on 06/03/10 15:40:
    Rick,

    I realised I'd misread the code too, but nevertheless, I still needed the
    additional bits you've given here.

    I'm not entirely sure what the sprintf is for in the code, because there are no
    % keywords in the format string - so the f_n_b-1 parts etc don't do anything...

    If you had N segments (of both transistors), then something like this would do it:

    for(seg 1 4
    sprintf(in1Name "A%d" seg)
    sprintf(in2Name "B%d" seg)

    ngatel = rodGetObj(sprintf(nil "ntranl/botGp_%d" seg) cv)
    ngater = rodGetObj(sprintf(nil "ntranr/botGp_%d" seg) cv)

    pgatel = rodGetObj(sprintf(nil "ptranl/botGp_%d" seg) cv)
    pgater = rodGetObj(sprintf(nil "ptranr/botGp_%d" seg) cv)


    ;; create the input connections in Poly
    foreach((input tpair) list(in1Name in2Name) list(
    list(ngatel pgatel) list(ngater pgater))
    rodCreatePath( ?cvId cv
    ?name input
    ?layer list(polyLayer "drawing")
    ?width polyWidth
    ?pts list(getq(car(tpair) upperCenter)
    rodPointX(getq(car(tpair)
    upperCenter)):rodPointY(getq(cadr(tpair)
    lowerCenter))-
    rodPointY(getq(car(tpair) upperCenter))/2.0
    rodPointX(getq(cadr(tpair)
    upperCenter)):rodPointY(getq(cadr(tpair)
    lowerCenter))-
    rodPointY(getq(car(tpair) upperCenter))/2.0
    getq(cadr(tpair) lowerCenter))
    ); rodCreatePath for input connections

    ); foreach
    ) ; for

    Regards,

    Andrew.
     
    Andrew Beckett, Jun 3, 2010
    #9
  10. rick

    rick Guest

    Hi Andrew - I think the intention was to pass/get/set the the finger
    count ( f_n_a, f_n_b, f_p_a, f_n_b ) to the device.
    Let me try this let will let you know the outcome

    Thanks!!!!

    Rick
     
    rick, Jun 3, 2010
    #10
  11. rick

    rick Guest

    When compiling, I get:

    \o function CCSdrawNand redefined
    \o Generating Pcell for 'nandInd layout'.
    \w *WARNING* rodPointX: Invalid Point: nil
    \w *WARNING* rodPointY: Invalid Point: nil
    \w *WARNING* rodPointY: Invalid Point: nil
    \e *Error* quotient: can't handle (nil / 2.0)
    \e *Error* load: error while loading file - "pCells/nand2.il_test"
     
    rick, Jun 3, 2010
    #11
  12. rick

    rick Guest

    Hi Andrew - Your implementation does work if the gates are hard coded
    for "X" number of gates and if the loop has the same
    count. example: for(seg 1 4 and there are 4 fingers set as
    the default, then all of the gates are connected. This proves
    that the code is mostly working, it just needs some added smarts/
    flexibility. If one of the device only has 2 gates then it will fail
    with
    pts set to nil since gate#3 does not exist. It needs to look at
    the finger count and execute the correct number of times for each
    device or something on those lines

    I can cheat and use the connectGates function in the device pCell but
    that still leaves the S/D which will have the same problem.
    The device also has a hook for this but its poorly implemented and
    just causes more problems so it would be nice to get this section
    working. How does this sound, make the foreach loop below a
    procedure and then call it for the gate, source, and drain
    connections.
    The number of times it goes through will equal the gate count for
    each device then have another section do the final hook up. The
    snowball
    is getting bigger...YIKES! :^)

    I very much appreciate your help!!!!!!!!!

    Rick
     
    rick, Jun 4, 2010
    #12
  13. rick wrote, on 06/04/10 00:18:
    Rick,

    Something like that sounds sensible, assuming you can route them in a similar
    fashion. You'd need to also pass the layer you want to route in as well, but
    that would be easy enough.

    Regards,

    Andrew.
     
    Andrew Beckett, Jun 4, 2010
    #13
Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.