Doc updates

This commit is contained in:
Matthias Koefferlein 2024-03-22 19:04:13 +01:00
parent c1602abce1
commit f4df6ec4ff
11 changed files with 285 additions and 17 deletions

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "klayout_doc.dtd">
<!-- generated by /home/matthias/klayout/0.28/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- generated by /home/matthias/klayout/master/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- DO NOT EDIT! -->
<doc>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "klayout_doc.dtd">
<!-- generated by /home/matthias/klayout/0.28/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- generated by /home/matthias/klayout/master/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- DO NOT EDIT! -->
<doc>

View File

@ -1,17 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "klayout_doc.dtd">
<!-- generated by /home/matthias/klayout/0.28/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- generated by /home/matthias/klayout/master/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- DO NOT EDIT! -->
<doc>
<title>DRC Reference: Global Functions</title>
<keyword name="global"/>
<p>
Some functions are available on global level and can be used without any object.
Most of them are convenience functions that basically act on some default object
or provide function-like alternatives for the methods.
</p>
<h2-index/>
<a name="angle"/><h2>"angle" - In universal DRC context: selects edges based on their orientation</h2>
<keyword name="angle"/>
@ -1843,6 +1838,36 @@ is equivalent to "layer.smoothed" (see <a href="/about/drc_ref_layer.xml#smoothe
argument, "smoothed" represents the polygon smoother on primary shapes within
<a href="/about/drc_ref_drc.xml">DRC</a> expressions (see <a href="/about/drc_ref_layer.xml#drc">Layer#drc</a> and <a href="/about/drc_ref_global.xml#smoothed">smoothed</a> for more details).
</p>
<a name="soft_connect"/><h2>"soft_connect" - Specifies a soft connection between two layers</h2>
<keyword name="soft_connect"/>
<p>Usage:</p>
<ul>
<li><tt>soft_connect(a, b)</tt></li>
</ul>
<p>
A "soft connection" is made between two layers and
is a directional connection (like an ideal diode).
Soft connections allow detecting if nets are connected
via a high-ohmic substrate or diffusion layer (the
"lower" layer).
"b" is the "lower" and "a" the upper layer.
</p><p>
See <a href="/about/drc_ref_netter.xml#connect">Netter#connect</a> for a more detailed description of that function.
</p>
<a name="soft_connect_global"/><h2>"soft_connect_global" - Specifies a soft connection to a global net</h2>
<keyword name="soft_connect_global"/>
<p>Usage:</p>
<ul>
<li><tt>soft_connect_global(l, name)</tt></li>
</ul>
<p>
Like <a href="#soft_connect">soft_connect</a>, a soft connection is made between
a layer and a global net (e.g. substrate). The global net
is always the "lower" net of the soft connection.
</p><p>
See <a href="/about/drc_ref_netter.xml#soft_connect_global">Netter#soft_connect_global</a> for a more detailed
description of that function.
</p>
<a name="source"/><h2>"source" - Specifies a source layout</h2>
<keyword name="source"/>
<p>Usage:</p>

View File

@ -1,15 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "klayout_doc.dtd">
<!-- generated by /home/matthias/klayout/0.28/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- generated by /home/matthias/klayout/master/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- DO NOT EDIT! -->
<doc>
<title>DRC Reference: Layer Object</title>
<keyword name="Layer"/>
<p>
The layer object represents a collection of polygons, edges or edge pairs.
</p>
<h2-index/>
<a name="&amp;"/><h2>"&amp;" - Boolean AND operation</h2>
<keyword name="&amp;"/>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "klayout_doc.dtd">
<!-- generated by /home/matthias/klayout/0.28/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- generated by /home/matthias/klayout/master/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- DO NOT EDIT! -->
<doc>
@ -434,6 +434,49 @@ layout analysis. Hence, all <a href="#connect">connect</a>, <a href="#connect_gl
calls must have been made before this method is used. Further <a href="#connect">connect</a>
statements will clear the netlist and re-extract it again.
</p>
<a name="soft_connect"/><h2>"soft_connect" - Specifies a soft connection between two layers</h2>
<keyword name="soft_connect"/>
<p>Usage:</p>
<ul>
<li><tt>soft_connect(a, b)</tt></li>
</ul>
<p>
a and b must be polygon or text layers. After calling this function, the
Netter considers shapes from layer a and b connected in "soft mode".
Typically, b is a high-ohmic layer such as diffusion, implant for substate
material, also called the "lower" layer.
</p><p>
A soft connection between shapes from layer a and b forms a directional
connection like an ideal diode: current can flow down, but now up
(not meant in the physical sense, this is a concept).
</p><p>
Hence, two nets are disconnected, if they both connect to the same lower layer,
but do not have a connection between them.
</p><p>
The netlist extractor will use this scheme to identify nets that are
connected only via such a high-ohmic region. Such a case is typically
bad for the functionality of a device and reported as an error.
Once, the check has been made and no error is found, soft-connected
nets are joined the same way than hard connections are made.
</p><p>
Beside this, soft connections follow the same rules than hard connections
(see <a href="#connect">connect</a>).
</p>
<a name="soft_connect_global"/><h2>"soft_connect_global" - Soft-connects a layer with a global net</h2>
<keyword name="soft_connect_global"/>
<p>Usage:</p>
<ul>
<li><tt>soft-connect_global(l, name)</tt></li>
</ul>
<p>
Connects the shapes from the given layer l to a global net with the given name
in "soft mode".
</p><p>
See <a href="#connect_global">connect_global</a> for details about the concepts of global nets.
See <a href="#soft_connect">soft_connect</a> for details about the concept of soft connections.
In global net soft connections, the global net (typically a substrate)
is always the "lower" layer.
</p>
<a name="top_level"/><h2>"top_level" - Specifies top level mode</h2>
<keyword name="top_level"/>
<p>Usage:</p>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "klayout_doc.dtd">
<!-- generated by /home/matthias/klayout/0.28/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- generated by /home/matthias/klayout/master/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- DO NOT EDIT! -->
<doc>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "klayout_doc.dtd">
<!-- generated by /home/matthias/klayout/0.28/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- generated by /home/matthias/klayout/master/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- DO NOT EDIT! -->
<doc>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "klayout_doc.dtd">
<!-- generated by /home/matthias/klayout/0.28/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- generated by /home/matthias/klayout/master/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- DO NOT EDIT! -->
<doc>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "klayout_doc.dtd">
<!-- generated by /home/matthias/klayout/0.28/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- generated by /home/matthias/klayout/master/scripts/drc_lvs_doc/extract_doc.rb -->
<!-- DO NOT EDIT! -->
<doc>

View File

@ -10,6 +10,7 @@
<h2-index/>
<h2>Intra- and inter-layer connections</h2>
<keyword name="connect"/>
<p>
The connectivity setup of a LVS script determines how the connections are made.
@ -77,6 +78,7 @@ connect(metal2, metal2_labels)</pre>
</p>
<h2>Global connections</h2>
<keyword name="connect_global"/>
<p>
KLayout supports implicit connections made across all polygons on
@ -98,6 +100,7 @@ connect(metal2, metal2_labels)</pre>
</p>
<h2>Implicit connections</h2>
<keyword name="connect_implicit"/>
<p>
Implicit connections can be useful to supply preliminary connections
@ -193,6 +196,7 @@ connect(metal2, metal2_labels)</pre>
</p>
<h2>Explicit connections</h2>
<keyword name="connect_explicit"/>
<p>
Explicit connections can be useful to enforce a connection in the layout
@ -280,4 +284,201 @@ connect_explicit("INV", [ "BULK", "VSS" ])
statements.
</p>
<h2>Soft connections</h2>
<keyword name="soft_connect"/>
<keyword name="soft_connect_global"/>
<p>
Soft connections are a way to find wiring issues where signals
or even power is routed over high-ohmic paths.
High-ohmic paths can be established through connections via
poly silicon, implant, well or substrate areas. Such areas
can easily show resistance values which are a hundred times
higher than that of metal connections. We have to make sure
that for routing power or critical signals, connections are
not made through such areas, but primarily through metal
connections.
</p>
<p>
Here is an example:
</p>
<p>
<img src="/manual/soft_connections.png"/>
</p>
<p>
In this case, we have a standard textbook planar CMOS technology with two PMOS devices
sitting in a n-well. These could be the two PMOS of two inverter pairs for example.
Both PMOS need to be connected to VDD at their sources. In addition, the n-well
area also needs to be tied to VDD in order to provide reverse bias for the p+ drain
areas and the body potential for the transistors, forming the opposite
electrode of the gate capacity.
</p>
<p>Such a technology stack can be described by the following connectivity:</p>
<pre># Input layers
nwell = ...
active = ...
pplus = ...
nplus = ...
poly = ...
contact = ...
metal1 = ...
via1 = ...
metal2 = ...
# computed layers
(nactive, pactive) = active.and_not(nwell)
# PMOS and NMOS source/drain regions
psd = (nactive &amp; pplus) - poly
nsd = (pactive &amp; nplus) - poly
# n tie and p tie (nwell and substrate contact)
ntie = nactive &amp; nplus
ptie = pactive &amp; pplus
# connections
# nwell connections
connect(ntie, nwell)
connect(contact, ntie)
# substrate connections
connect_global(ptie, "BULK")
connect(contact, ptie)
# device connections
connect(contact, psd)
connect(contact, nsd)
connect(contact, poly)
# metal connections
connect(metal1, contact)
connect(via1, metal1)
connect(metal2, via1)
</pre>
<p>
However, there is an issue:
As shown in the picture, the left PMOS source is properly connected to VDD.
The right one however lacks the metal connection to VDD. From the perspective
of pure connectivity, this transistor's source is connected to VDD, but only
through a weak n-well connection. Such a device will not work - or at least, badly.
</p>
<p>
The solution is to introduce soft connections. Soft connections are made
by replacing "connect" with "soft_connect" and "connect_global" with "soft_connect_global"
(see <a href="/about/drc_ref_global.xml#soft_connect">soft_connect</a> and
<a href="/about/drc_ref_global.xml#soft_connect_global">soft_connect_global</a>).
The first layer is the "upper" layer while the second layer is the "lower" layer.
The lower layer is the high-ohmic one. In global connections, the global net is
always the high-ohmic one.
</p>
<p>
Soft connections can be visualized as directional connections: current can only flow from the
upper to the lower layer, but not the other way. So, a real connection is only made,
if both upper terminals of the soft connections are connected to the same physical net.
</p>
<p>
To solve the n-well issue we have to substitute the n-tie to n-well connection statement
by a "soft_connect" statement:
</p>
<pre>soft_connect(ntie, nwell)</pre>
<p>
The above picture now looks like this:
</p>
<p>
<img src="/manual/soft_connections2.png"/>
</p>
<p>
With this definition, the netlist extractor is able to detect the fault
and raise a warning or an error (in top level mode).
The warning is shown on the log tab and indicates incomplete wiring plus
details about the disconnected subnets, formed by the soft connection.
</p>
<p>
The complete the setup we also need to include other soft connections,
such as connections via substrate (a global soft connect to the BULK net),
via source/drain implants, via the tie implants and via poly:
</p>
<pre># Input layers
nwell = ...
active = ...
pplus = ...
nplus = ...
poly = ...
contact = ...
metal1 = ...
via1 = ...
metal2 = ...
# computed layers
(nactive, pactive) = active.and_not(nwell)
# PMOS and NMOS source/drain regions
psd = (nactive &amp; pplus) - poly
nsd = (pactive &amp; nplus) - poly
# n tie and p tie (nwell and substrate contact)
ntie = nactive &amp; nplus
ptie = pactive &amp; pplus
# connections
# nwell connections
soft_connect(ntie, nwell)
soft_connect(contact, ntie)
# substrate connections
soft_connect_global(ptie, "BULK")
soft_connect(contact, ptie)
# device connections
soft_connect(contact, psd)
soft_connect(contact, nsd)
soft_connect(contact, poly)
# metal connections
connect(metal1, contact)
connect(via1, metal1)
connect(metal2, via1)
</pre>
<p>
As this code demonstrates, multiple soft connections can be specified.
From the perspective of the check, all soft connections are of the same kind.
</p>
<p>
Note, that two opposite soft connections cancel, so this would eventually
make a hard connection:
</p>
<pre>soft_connect(a, b)
soft_connect(b, a)
</pre>
<p>
<b>NOTE:</b> It is therefore important to observe the direction of soft connections:
upper and high-conductive / low-ohmic layer first, and lower and low-conductive / high-ohmic
layer second.
</p>
</doc>

View File

@ -244,6 +244,8 @@
<file alias="drc_raw1.png">doc/images/drc_raw1.png</file>
<file alias="drc_raw2.png">doc/images/drc_raw2.png</file>
<file alias="drc_raw3.png">doc/images/drc_raw3.png</file>
<file alias="soft_connections.png">doc/manual/soft_connections.png</file>
<file alias="soft_connections2.png">doc/manual/soft_connections2.png</file>
</qresource>
<qresource prefix="/help/programming">
<file alias="introduction.xml">doc/programming/introduction.xml</file>