SKY130 Open PDK Integration #103
Replies: 3 comments
-
Seeing the h.Nmos("20.0V", MosVth.ULTRA_LOW) Instead we have: s.Nmos20V(MosVth.ULTRA_LOW) This allow the user to quickly find their device of choice with |
Beta Was this translation helpful? Give feedback.
-
Awesome work on this! A few general things -
More tactically:
@h.module
class HasMos:
m1 = h.Mos(...)(...) # instantiate a generic primitive `Mos`
# Now "compile" this into different technologies
pdk1.compile(HasMos)
pdk2.compile(HasMos) Requiring setting a There's an easy alternative if you want a particular technology's particular, bespoke element: just instantiate its PDK-package's I added some (even) more tactical line-by-line commentary on the PR. Thanks again here this is great! |
Beta Was this translation helpful? Give feedback.
-
Related thought which came up on the GF180 PR: In each of these technologies, there should, in general, be some notion of "the regular transistors". I.e. the ones the standard logic library uses. Often called the "core" transistors, etc. The idea of having different thresholds We should reserve the |
Beta Was this translation helpful? Give feedback.
-
Hi, I'm currently hacking on expanding the SKY130-HDL21 module to include everything seen here and I wanted to ask questions about/plan out loud the design:
Expanding Mos Variants
I'm guessing from the ioxtors here that the general pattern should be to group by this particular heirarchy:
MosType
- Pmos or Nmosmodel
- Transistor type, operating voltage, is it native, is it used for ESD?MosVth
- What is the threshold voltage?Is this robust enough that if I encounter a zero-threshold - I should actually expand
MosVth
to include aZTH
parameter?Introducing Resistors
Resistors in the SKY130 PDK are split into two camps, generic resistors (which accept W and L parameters) and precision resistors (fixed width with L parameter left up to user) - so my understanding of how
HeirarchyWalker
should work in this instance is that I should have seperate cases handling:My understanding is that this should be done using the following recipe:
paramclass
esSky130PrecResParams
andSky130GenResParams
that respectively containW,L
and justL
._res_module
builder function then takes amodname
, number of terminals and desiredparamclass
, as well asmodel
string to easily distinguish between different kinds of resistors.res_module_call
insideHeirarchyWalker
should be able to distinguish betweenPhysicalResistor
andThreeTerminalResistor
primitives and useres_module
to determine what resistor is being used from the returned module'smodel
parameter.Capacitors
Capacitors are complicated from the device details, there are two objects that I think might actually require new primitives:
Each species of capacitor should get its own
paramclass
(particularly MiM/Varactors) - but the rest seem to correspond to pre-defined capacitor cells in the PDK - so I'm tempted to create aSky130DeviceParams
paramclass which is just an alias forHasNoParams
and to just usedmodel
as a key.BJT/Diodes
All BJTs and Diodes simply seem to need being distinguished via model name and
BipolarType
in the case of BJTs. I don't believe that there are yet parametric models for BJTs or Diodes available, so these will have to bundled similarly with theSky130DeviceParams
nothingparamclass
andmodel
key.House-keeping Notes
To try and keep the code presentable and not overly cluttered, I'm thinking of implementing using the following guidelines:
pdk.py
should be for theInstallation
class, imports andCorners
pdkparams.py
allparamclass
objects should be definedpdkmodules.py
allExternalModule
creating functions should be definedpdk,py
will be long lists callingpdkmodule
functions to build out module dictionariespdk.py
which include the usual_module_call
methods withinLet me know what you think of this idea or any suggestions for how this can be improved.
Beta Was this translation helpful? Give feedback.
All reactions