23 December 2021 at 15:44 #6672Tommaso LunghiParticipant
Dear Nazca guys,
I am using the interconnect class to make the metal wiring in my layout. I have two related issues that I need to solve and I am wondering whether you might provide some suggestions.
1) Sometimes I need to place via cells along the interconnect path with a fixed spacing. This vias are Cell (but might be simplified to Polygon if needed). Currently I manually place these vias.
2) The metal connection between two elements (two pads for example) starts and ends with a particular stub (something similar to a rounded taper). Currently I used to draw the initial/end stub and snap the interconnect metal between the two stubs.
My point is: is there a way to modify the interconnect class to place a specific cell along the path at specific positions (end, begin or every x um)? My current idea substantially consists in rewriting the interconnect class and add this possibility, but it does not seem very efficient. Do you have any better suggestions?
Thanks for your amazing work. I wish you a happy Christmas
Tommaso8 January 2022 at 14:31 #6681RonaldKeymaster
Thank you for the wishes.
Interconnects are based on (curved) lines. A line can be assigned a (varying) thickness and thus becomes a waveguide (or metal line). Lines can be described in countless ways. Compare for example a curved Nazca cobra interconnect with a straight line. Finding positions along a line at equal distance requires in generic terms a parameterized description of the line [x(t), y(t)] that traces the line at a constant speed w.r.t. to parameter t. However, it is unlikely that the length of an arbitrary line is linear in t by default. For that to happen we would need condition “A” to be true:
A: (dx(t)/dt)^2 + (dy(t)/dt)^2) = C^2,
where C is a constant and C * dt describes the (local) distance between points on the line.
Fortunately, we can enforce condition “A” across the whole line having the same C by defining a new parameter s and function t = f(s) such that we obtain condition “B” for all s:
B: (dx(f)/df * df(s)/ds)^2 + (dy(f)/df * df(s)/ds)^2 = C^2.
If we consider an interconnect to be a series of N connected (and possibly different) line definitions (e.g. bend, straight, straight, bend etc), indexed as i = 0, … N-1, we need to create a function fi(s) for each line such that all N lines now have the same C value under condition “B”. Here we assume f(s) covers the full t domain monotonously. We also need to know the length of each line in the series to get to the same C along the whole interconnect. In short, we need to reparameterize all interconnect elements from t to s following “B”.
Obtaining exact positions along the interconnect may have varying difficulty levels depending on the line type. A straight line of length L described as x(t) = t * L, where t in [0, 1] will have C = L under condition “A”. If C is no longer free to choose we apply condition “B” and use t = f(s) = a * s and obtain L * a = C and find a = C / L.
Hence, the linearized and normalized “constant speed” parametric straight line in s can be expressed as
x(s) = s * C, where s in [0, L / C].
Similarly, for an arc bend defined by [R*cos(phi*t), R*sin(phi*t)], with t in [0, 1] and reparametrization with t = f(s) = a * s we obtain a = C /(phi * R) and the linearized and normalized “constant speed” parametric bend in s becomes
[x(s), y(s)] = [R*cos(s*C/R), R*sin(s*C/R)], for s in [0, phi*R/C]
For curves without an analytical solution we would need to resort to a (ideally generic) numerical solution to reparametrize them.
Still, when placing elements along the interconnect, as you describe in your question, one needs to be able access all the interconnect elements (line definitions) in the first place, and calculate [x(s), y(s)] for a certain list of s values. The good news is that Nazca already has been testing since last summer an interconnect upgrade which is a dict-based description of all the elements in an interconnect (versions > 0.5.13). Hence, you can simply scan through the those line elements, apply the reparametrization as described above, and generate equidistant positions along the interconnect. More elegantly, one would create an output terminal that generates these positions when provided with the interconnect dict as input. The default terminal generates gds layout. In addition, a final solution would store reparametrization options inside the interconnect line definitions from the start, or as a generic filter function. Reparameterization is also already an ongoing development in Nazca for other purposes. The website release is a bit overdue, not because little has happened, but rather the opposite.
Ronald19 January 2022 at 14:50 #6685Tommaso LunghiParticipant
thanks for your insights, they have been quite helpful.
- You must be logged in to reply to this topic.