dump ROD names

R

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?
 
On Jun 2, 2:08 am, rick <ej...@pacbell.net> wrote:
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?
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
 
On Jun 1, 10:19 pm, lokesh <lokeshr...@gmail.com> wrote:
On Jun 2, 2:08 am, rick <ej...@pacbell.net> wrote:

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?

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
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
 
lokesh wrote, on 06/02/10 07:22:
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
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.
 
On Jun 2, 10:50 am, rick <ej...@pacbell.net> wrote:
On Jun 1, 10:19 pm, lokesh <lokeshr...@gmail.com> wrote:



On Jun 2, 2:08 am, rick <ej...@pacbell.net> wrote:

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?

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

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
On Jun 2, 10:50 am, rick <ej...@pacbell.net> wrote:
On Jun 1, 10:19 pm, lokesh <lokeshr...@gmail.com> wrote:



On Jun 2, 2:08 am, rick <ej...@pacbell.net> wrote:

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?

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

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
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
 
On Jun 2, 1:13 am, Andrew Beckett <andr...@DcEaLdEeTnEcTe.HcIoSm>
wrote:
lokesh wrote, on 06/02/10 07:22:





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

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.
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 wrote, on 06/03/10 00:01:
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,

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.
 
rick wrote, on 06/03/10 15:40:
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,

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.
 
On Jun 3, 2:44 am, Andrew Beckett <andr...@DcEaLdEeTnEcTe.HcIoSm>
wrote:
rick wrote, on 06/03/10 00:01:





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,

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.
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
 
On Jun 3, 9:21 am, Andrew Beckett <andr...@DcEaLdEeTnEcTe.HcIoSm>
wrote:
rick wrote, on 06/03/10 15:40:





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,

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.
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
 
On Jun 3, 9:46 am, rick <ej...@pacbell.net> wrote:
On Jun 3, 9:21 am, Andrew Beckett <andr...@DcEaLdEeTnEcTe.HcIoSm
wrote:



rick wrote, on 06/03/10 15:40:

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,

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.

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
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"
 
On Jun 3, 9:46 am, rick <ej...@pacbell.net> wrote:
On Jun 3, 9:21 am, Andrew Beckett <andr...@DcEaLdEeTnEcTe.HcIoSm
wrote:



rick wrote, on 06/03/10 15:40:

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,

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.

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
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 wrote, on 06/04/10 00:18:
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,

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.
 

Welcome to EDABoard.com

Sponsor

Back
Top