1656 lines
190 KiB
HTML
1656 lines
190 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="description" content="Printable version of this Document PythonTutorial.pdf Contents Printable version of this Document 1. Introduction 2. Setting up the Environment 3. Making a Standard Cell -- Layout 4. Manipulating...">
|
|
<meta name="keywords" content="">
|
|
<link rel="icon" href="../favicon.ico">
|
|
|
|
<title>Hurricane+Python Tutorial - Coriolis VLSI CAD Tools [offline]</title>
|
|
|
|
<!-- Stylesheets -->
|
|
<link href="../theme/css/bootstrap.css" rel="stylesheet">
|
|
<link href="../theme/css/fonts.css" rel="stylesheet">
|
|
<link href="../theme/css/nest.css" rel="stylesheet">
|
|
<link href="../theme/css/pygment.css" rel="stylesheet">
|
|
<link href="../theme/css/coriolis.css" rel="stylesheet">
|
|
<!-- /Stylesheets -->
|
|
|
|
<script src="../theme/js/jquery.min.js"></script>
|
|
<script src="../theme/js/bootstrap.min.js"></script>
|
|
|
|
<!-- RSS Feeds -->
|
|
<!-- /RSS Feeds -->
|
|
|
|
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
|
<!--[if lt IE 9]>
|
|
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
|
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
|
<![endif]-->
|
|
|
|
|
|
|
|
</head>
|
|
|
|
<body>
|
|
<!-- Header -->
|
|
<div class="header-container" style="background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), url('../images/common/layout-motif-faded-4.png'); background-position: center; ">
|
|
|
|
|
|
<!--
|
|
<div class="container">
|
|
<nav class="navbar navbar-default">
|
|
<div class="container-fluid">
|
|
<div class="navbar-header">
|
|
<a class="navbar-brand" href="../"><img class="mr20" src="../images/common/Coriolis-logo-white-4-small.png" alt="logo">Coriolis VLSI CAD Tools [offline]</a>
|
|
</div>
|
|
<ul class="nav navbar-nav">
|
|
<li><a href="../pages/gitlab.html">Git</a></li>
|
|
<li><a href="../pages/documentation.html">Documentation</a></li>
|
|
<li class="dropdown">
|
|
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
|
|
<span class="caret"></span>Topics
|
|
</button>
|
|
<ul class="dropdown-menu">
|
|
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
|
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
</div> <!-- navbar container -->
|
|
-->
|
|
|
|
<!-- Static navbar -->
|
|
<div class="container">
|
|
<div class="header-nav">
|
|
<div class="header-logo">
|
|
<a class="pull-left" href="../"><img class="mr20" src="../images/common/Coriolis-logo-white-4-small.png" alt="logo">Coriolis VLSI CAD Tools [offline]</a>
|
|
</div>
|
|
<div class="nav pull-right">
|
|
<a href="../pages/gitlab.html">Git</a>
|
|
<a href="../pages/documentation.html">Documentation</a>
|
|
</div>
|
|
<div class="nav pull-right">
|
|
<div class="dropdown">
|
|
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
|
|
<span class="caret"></span>Topics
|
|
</button>
|
|
<ul class="dropdown-menu">
|
|
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
|
|
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- /Static navbar -->
|
|
|
|
<!-- Header -->
|
|
<div class="container header-wrapper">
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<div class="header-content">
|
|
<a href="https://www.lip6.fr/"><img class="mr20" height="60px" src="../images/common/LogoLIP6Blanc.png" alt="LIP6"></a>
|
|
<a href="https://www.sorbonne-universite.fr/"><img class="mr20" height="60px" src="../images/common/logo-SU-blanc-700px.png" alt="Sorbonne Universite"></a>
|
|
<a href="https://www.cnrs.fr/"><img class="mr20" height="60px" src="../images/common/LOGO-cnrs-white-large.png" alt="CNRS"></a>
|
|
<h1 class="header-title text-uppercase">Hurricane+Python Tutorial</h1>
|
|
<div class="header-underline"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- /Header -->
|
|
|
|
</div>
|
|
<!-- /Header -->
|
|
|
|
|
|
<!-- Content -->
|
|
<div class="container content">
|
|
<!-- -*- mode: rst; explicit-buffer-name: "PythonTutorial_HTML.rst<pelican>" -*- -->
|
|
<!-- -*- Mode: rst; explicit-buffer-name: "definition.rst<documentation/etc>" -*- -->
|
|
<!-- HTML/LaTeX backends mixed macros. -->
|
|
<!-- Acronyms & names. -->
|
|
<!-- URLs -->
|
|
<!-- Standard CAO/VLSI Concepts. -->
|
|
<!-- Alliance & MBK Concepts -->
|
|
<!-- Hurricane Concepts. -->
|
|
<div class="section" id="printable-version-of-this-document">
|
|
<h2><a class="toc-backref" href="#id9">Printable version of this Document</a></h2>
|
|
<p><a class="reference external" href="../pdfs/PythonTutorial.pdf">PythonTutorial.pdf</a></p>
|
|
<div class="contents topic" id="contents">
|
|
<p class="topic-title">Contents</p>
|
|
<ul class="simple">
|
|
<li><a class="reference internal" href="#printable-version-of-this-document" id="id9">Printable version of this Document</a></li>
|
|
<li><a class="reference internal" href="#introduction" id="id10">1. Introduction</a></li>
|
|
<li><a class="reference internal" href="#setting-up-the-environment" id="id11">2. Setting up the Environment</a></li>
|
|
<li><a class="reference internal" href="#making-a-standard-cell-layout" id="id12">3. Making a Standard Cell -- Layout</a></li>
|
|
<li><a class="reference internal" href="#manipulating-cells-nets-and-components" id="id13">4. Manipulating Cells, Nets and Components</a></li>
|
|
<li><a class="reference internal" href="#id3" id="id14">5. Make a script runnable through <span class="cb">cgt</span></a></li>
|
|
<li><a class="reference internal" href="#making-a-hierarchical-cell-netlist" id="id15">6. Making a hierarchical Cell -- Netlist</a></li>
|
|
<li><a class="reference internal" href="#working-in-real-mode" id="id16">7. Working in real mode</a></li>
|
|
<li><a class="reference internal" href="#tool-engines-crl-core" id="id17">8. Tool Engines (CRL Core)</a></li>
|
|
<li><a class="reference internal" href="#advanced-topics" id="id18">9. Advanced Topics</a></li>
|
|
</ul>
|
|
</div>
|
|
<p>First, a small disclaimer. This tutorial assumes that you are already familiar
|
|
with the concepts of <span class="sc">vlsi</span> designs, such as <em>netlist</em>, <em>layout</em>, <em>instances</em>
|
|
and hierarchical design.</p>
|
|
<!-- -*- Mode: rst -*- -->
|
|
<!-- Hurricane doxygen doc links. -->
|
|
<!-- Hurricane Viewer doxygen doc links. -->
|
|
<!-- CRL Core doxygen doc links. -->
|
|
<!-- Hurricane Python Tutorial internal links. -->
|
|
<!-- -*- Mode: rst -*- -->
|
|
</div>
|
|
<div class="section" id="introduction">
|
|
<h2><a class="toc-backref" href="#id10">1. Introduction</a></h2>
|
|
<p>This tutorial is aimed at two goals :</p>
|
|
<ul class="simple">
|
|
<li>Presenting how to use Python scripts to control <span class="sc">Coriolis</span>.</li>
|
|
<li>Make a basic introduction about the <span class="sc">Hurricane</span> database and its
|
|
concepts.</li>
|
|
</ul>
|
|
<p>While this tutorial is aimed at presenting the <span class="sc">Hurricane</span> database,
|
|
do not feel limited by it. You can use <span class="sc">Hurricane</span> objects as attributes
|
|
of <span class="sc">Python</span> objects or use <span class="sc">Python</span> containers to store them.
|
|
The only limitation is that you may not use <span class="sc">Hurricane</span> classes as base
|
|
classes in <span class="sc">Python</span>.</p>
|
|
<p>All the example scripts given in this tutorial con be found under:</p>
|
|
<pre class="literal-block">
|
|
<CORIOLIS_INSTALL>/share/doc/coriolis2/examples/scripts/
|
|
</pre>
|
|
<p>Provided scripts:</p>
|
|
<table class="table">
|
|
<colgroup>
|
|
<col width="27%" />
|
|
<col width="73%" />
|
|
</colgroup>
|
|
<thead valign="bottom">
|
|
<tr><th class="head"><strong>Script</strong></th>
|
|
<th class="head"><strong>Feature</strong></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody valign="top">
|
|
<tr><td><span class="cb">coriolisLogo.py</span></td>
|
|
<td>Draw a layout of the <span class="sc">Coriolis</span> logo</td>
|
|
</tr>
|
|
<tr><td><span class="cb">diagonals.py</span></td>
|
|
<td>Test the <span class="cb">Hurricane::Diagonal</span> class</td>
|
|
</tr>
|
|
<tr><td><span class="cb">polygons.py</span></td>
|
|
<td>Test the <span class="cb">Hurricane::Polygon</span> class</td>
|
|
</tr>
|
|
<tr><td><span class="cb">rectilinear.py</span></td>
|
|
<td>Test the <span class="cb">Hurricane::rectilinear</span> class</td>
|
|
</tr>
|
|
<tr><td><span class="cb">invertor.py</span></td>
|
|
<td>Procedural build of the layout of an invertor standard cell</td>
|
|
</tr>
|
|
<tr><td><span class="cb">fulladder.py</span></td>
|
|
<td>Procedural build of a small netlist along with it's manual
|
|
placement and the routing of one net (<span class="cb">"a"</span>)</td>
|
|
</tr>
|
|
<tr><td><span class="cb">toolengines.py</span></td>
|
|
<td>Build the netlist (only) of the full adder then call the
|
|
place and route engines</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<div class="section" id="terminology">
|
|
<h3>1.1 Terminology</h3>
|
|
<p>In the <span class="sc">Hurricane</span> database, the <em>logical</em> (netlist) and <em>physical</em> (layout)
|
|
views are fused. As the main goal of the database is to support place & route
|
|
tools, we usually starts with a <em>pure</em> netlist which is progessively enriched
|
|
to become a layout. Cell, in particular, is able to be in any intermediate
|
|
state. Many of our objects have self-explanatory names, but some
|
|
don't. Thus we summarize below the more important ones:</p>
|
|
<table class="table">
|
|
<colgroup>
|
|
<col width="22%" />
|
|
<col width="78%" />
|
|
</colgroup>
|
|
<thead valign="bottom">
|
|
<tr><th class="head"><strong>Class</strong></th>
|
|
<th class="head"><strong>Meaning</strong></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody valign="top">
|
|
<tr><td><a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a></td>
|
|
<td>The model. A Cell does not have terminals, only nets
|
|
flagged as <em>external</em></td>
|
|
</tr>
|
|
<tr><td><a class="reference external" href="../../hurricane/classHurricane_1_1Instance.html">Instance</a></td>
|
|
<td>An instance of a model</td>
|
|
</tr>
|
|
<tr><td><a class="reference external" href="../../hurricane/classHurricane_1_1Net.html">Net</a></td>
|
|
<td>A grouping of electrically connected components</td>
|
|
</tr>
|
|
<tr><td><a class="reference external" href="../../hurricane/classHurricane_1_1Plug.html">Plug</a></td>
|
|
<td>A terminal of an instance</td>
|
|
</tr>
|
|
<tr><td><a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a></td>
|
|
<td>A physical connexion (<em>pin</em>) to an instance</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="section" id="generalities">
|
|
<h3>1.2 Generalities</h3>
|
|
<p>The C++ API has been exported in Python as closely as possible. Meaning
|
|
that, save for a slight change in syntax, any code written in <span class="sc">Python</span>
|
|
could be easily transformed into C++ code. There is no specific documentation
|
|
written for the <span class="sc">Python</span> interface, you may directly use the C++ one.</p>
|
|
<p>Mostly:</p>
|
|
<ul class="simple">
|
|
<li>C++ namespaces are exported as <span class="sc">Python</span> modules.</li>
|
|
<li>The <em>scope resolution operator</em> <span class="fboxtt">::</span> converts into <span class="fboxtt">.</span>.</li>
|
|
<li>C++ blocks (between braces <span class="fboxtt">{}</span>) are replaced by indentations.</li>
|
|
<li>In C++, names are managed through a dedicated <tt class="docutils literal">Name</tt> class.
|
|
It has not been exported to the <span class="sc">Python</span> interface, you only have
|
|
to use <tt class="docutils literal">string</tt>.</li>
|
|
<li>Coordinates are expressed in <tt class="docutils literal">DbU</tt> which are <tt class="docutils literal">long</tt> with a special
|
|
semantic (see ??).</li>
|
|
<li>All <span class="sc">Hurricane</span> objects implements the <span class="sc">Python</span> <tt class="docutils literal">__str__()</tt> function,
|
|
they print the result of the C++ method <tt class="docutils literal">::getString()</tt>.</li>
|
|
</ul>
|
|
<p>In <tt class="docutils literal">hurricane/Net.h</tt> header we have:</p>
|
|
<div class="highlight"><pre><span></span><span class="k">namespace</span> <span class="n">Hurricane</span> <span class="p">{</span>
|
|
|
|
<span class="k">class</span> <span class="nc">Net</span> <span class="o">:</span> <span class="k">public</span> <span class="n">Entity</span> <span class="p">{</span>
|
|
<span class="k">public</span><span class="o">:</span>
|
|
<span class="k">class</span> <span class="nc">Direction</span> <span class="p">{</span>
|
|
<span class="k">public</span><span class="o">:</span> <span class="k">enum</span> <span class="nc">Code</span> <span class="p">{</span> <span class="n">DirIn</span> <span class="o">=</span> <span class="mh">0x0001</span>
|
|
<span class="p">,</span> <span class="n">DirOut</span> <span class="o">=</span> <span class="mh">0x0002</span>
|
|
<span class="p">,</span> <span class="n">DirUndefined</span> <span class="o">=</span> <span class="mh">0x0000</span>
|
|
<span class="p">,</span> <span class="n">ConnTristate</span> <span class="o">=</span> <span class="mh">0x0100</span>
|
|
<span class="p">,</span> <span class="n">ConnWiredOr</span> <span class="o">=</span> <span class="mh">0x0200</span>
|
|
<span class="p">,</span> <span class="n">UNDEFINED</span> <span class="o">=</span> <span class="n">DirUndefined</span>
|
|
<span class="p">,</span> <span class="n">IN</span> <span class="o">=</span> <span class="n">DirIn</span>
|
|
<span class="p">,</span> <span class="n">OUT</span> <span class="o">=</span> <span class="n">DirOut</span>
|
|
<span class="p">,</span> <span class="n">INOUT</span> <span class="o">=</span> <span class="n">DirIn</span> <span class="o">|</span> <span class="n">DirOut</span>
|
|
<span class="p">,</span> <span class="n">TRISTATE</span> <span class="o">=</span> <span class="n">DirOut</span> <span class="o">|</span> <span class="n">ConnTristate</span>
|
|
<span class="p">,</span> <span class="n">TRANSCV</span> <span class="o">=</span> <span class="n">DirIn</span> <span class="o">|</span> <span class="n">DirOut</span> <span class="o">|</span> <span class="n">ConnTristate</span>
|
|
<span class="p">,</span> <span class="n">WOR_OUT</span> <span class="o">=</span> <span class="n">DirOut</span> <span class="o">|</span> <span class="n">ConnWiredOr</span>
|
|
<span class="p">,</span> <span class="n">WOR_INOUT</span> <span class="o">=</span> <span class="n">DirIn</span> <span class="o">|</span> <span class="n">DirOut</span> <span class="o">|</span> <span class="n">ConnWiredOr</span>
|
|
<span class="p">,</span> <span class="n">DirMask</span> <span class="o">=</span> <span class="n">DirIn</span> <span class="o">|</span> <span class="n">DirOut</span> <span class="o">|</span> <span class="n">DirUndefined</span>
|
|
<span class="p">};</span>
|
|
<span class="c1">// [The rest of Class Direction]</span>
|
|
<span class="p">};</span>
|
|
<span class="k">public</span><span class="o">:</span>
|
|
<span class="k">static</span> <span class="n">Net</span><span class="o">*</span> <span class="n">create</span> <span class="p">(</span> <span class="n">Cell</span><span class="o">*</span> <span class="p">,</span> <span class="k">const</span> <span class="n">Name</span><span class="o">&</span> <span class="p">);</span>
|
|
<span class="kt">bool</span> <span class="nf">isGlobal</span> <span class="p">();</span>
|
|
<span class="kt">bool</span> <span class="nf">isExternal</span> <span class="p">();</span>
|
|
<span class="k">const</span> <span class="n">Direction</span><span class="o">&</span> <span class="n">getDirection</span> <span class="p">();</span>
|
|
<span class="kt">void</span> <span class="nf">setName</span> <span class="p">(</span> <span class="n">Name</span> <span class="p">);</span>
|
|
<span class="kt">void</span> <span class="nf">setGlobal</span> <span class="p">(</span> <span class="kt">bool</span> <span class="p">);</span>
|
|
<span class="kt">void</span> <span class="nf">setExternal</span> <span class="p">(</span> <span class="kt">bool</span> <span class="p">);</span>
|
|
<span class="kt">void</span> <span class="nf">setDirection</span> <span class="p">(</span> <span class="k">const</span> <span class="n">Direction</span><span class="o">&</span> <span class="p">);</span>
|
|
<span class="c1">// [The rest of Class Net]</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="p">}</span>
|
|
</pre></div>
|
|
<p>So we can use it the following way in C++:</p>
|
|
<div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">"hurricane/Net.h"</span><span class="cp"></span>
|
|
|
|
<span class="k">using</span> <span class="k">namespace</span> <span class="n">Hurricane</span><span class="p">;</span>
|
|
|
|
<span class="kt">void</span> <span class="nf">addNetToCell</span> <span class="p">(</span> <span class="n">Cell</span><span class="o">*</span> <span class="n">cell</span> <span class="p">)</span>
|
|
<span class="p">{</span>
|
|
<span class="n">Net</span><span class="o">*</span> <span class="n">net</span> <span class="o">=</span> <span class="n">Net</span><span class="o">::</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s">"new_net"</span> <span class="p">);</span>
|
|
<span class="n">net</span><span class="o">-></span><span class="n">setGlobal</span> <span class="p">(</span> <span class="nb">false</span> <span class="p">);</span>
|
|
<span class="n">net</span><span class="o">-></span><span class="n">setExternal</span> <span class="p">(</span> <span class="nb">true</span> <span class="p">);</span>
|
|
<span class="n">net</span><span class="o">-></span><span class="n">setDirection</span><span class="p">(</span> <span class="n">Net</span><span class="p">.</span><span class="n">Direction</span><span class="p">.</span><span class="n">IN</span> <span class="p">);</span>
|
|
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"Created "</span> <span class="o"><<</span> <span class="n">net</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="n">net</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</pre></div>
|
|
<p>The equivalent <span class="sc">Python</span> code will be:</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="n">Net</span>
|
|
|
|
<span class="k">def</span> <span class="nf">addNetToCell</span> <span class="p">(</span> <span class="n">cell</span> <span class="p">):</span>
|
|
<span class="n">net</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">"new_net"</span> <span class="p">)</span>
|
|
<span class="n">net</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">False</span> <span class="p">)</span>
|
|
<span class="n">net</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">net</span><span class="o">.</span><span class="n">setDirection</span><span class="p">(</span> <span class="n">Net</span><span class="o">.</span><span class="n">Direction</span><span class="o">.</span><span class="n">IN</span> <span class="p">)</span>
|
|
<span class="nb">print</span><span class="p">(</span> <span class="s2">"Created"</span><span class="p">,</span> <span class="n">net</span> <span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">net</span>
|
|
</pre></div>
|
|
</div>
|
|
<div class="section" id="various-kinds-of-constructors">
|
|
<h3>1.3 Various Kinds of Constructors</h3>
|
|
<p>Regarding the memory allocation, the <span class="sc">Hurricane</span> database contains two kind of objects.</p>
|
|
<ol class="arabic">
|
|
<li><p class="first">Objects that are linked to others in the database and whose creation or deletion
|
|
implies coherency operations. This is the case for <a class="reference external" href="../../hurricane/classHurricane_1_1Net.html">Net</a> or <a class="reference external" href="../../hurricane/classHurricane_1_1Horizontal.html">Horizontal</a>.
|
|
They must be created using the static <span class="cb">create()</span> method of their class
|
|
and destroyed with their <span class="cb">destroy()</span> method.</p>
|
|
<p>And, of course, they cannot be copied (the copy constructor has been disabled).</p>
|
|
<div class="highlight"><pre><span></span><span class="n">net</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s1">'tmp'</span> <span class="p">)</span> <span class="c1"># Call the static Net.create() function.</span>
|
|
<span class="c1"># Work with this net.</span>
|
|
<span class="c1"># ...</span>
|
|
<span class="n">net</span><span class="o">.</span><span class="n">destroy</span><span class="p">()</span> <span class="c1"># Call the dynamic destroy() method.</span>
|
|
</pre></div>
|
|
</li>
|
|
<li><p class="first">Objects that are <em>standalone</em>, like <a class="reference external" href="../../hurricane/classHurricane_1_1Point.html">Point</a> or <a class="reference external" href="../../hurricane/classHurricane_1_1Box.html">Box</a>, uses the usual construction
|
|
methods. They also use the <span class="sc">Python</span> garbage collector mechanism and do not need
|
|
to be explicitly deleted.</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="n">DbU</span><span class="p">,</span> <span class="n">Box</span>
|
|
|
|
<span class="k">def</span> <span class="nf">myfunc</span><span class="p">():</span>
|
|
<span class="n">bb</span> <span class="o">=</span> <span class="n">Box</span><span class="p">(</span> <span class="n">DbU</span><span class="o">.</span><span class="n">fromLambda</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">DbU</span><span class="o">.</span><span class="n">fromLambda</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">DbU</span><span class="o">.</span><span class="n">fromLambda</span><span class="p">(</span><span class="mf">15.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">DbU</span><span class="o">.</span><span class="n">fromLambda</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="k">return</span> <span class="c1"># bb will be freed at that point.</span>
|
|
</pre></div>
|
|
</li>
|
|
</ol>
|
|
</div>
|
|
<div class="section" id="collections-and-iterators">
|
|
<h3>1.4 Collections and Iterators</h3>
|
|
<p>Hurricane <a class="reference external" href="../../hurricane/classHurricane_1_1Collection.html">Collection</a> behave like containers under <span class="sc">Python</span> and provide
|
|
support for the <span class="cb">iterator</span> protocol.</p>
|
|
<blockquote>
|
|
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="n">Net</span><span class="p">,</span> <span class="n">Horizontal</span>
|
|
|
|
<span class="k">def</span> <span class="nf">delAllHorizontals</span> <span class="p">(</span> <span class="n">net</span> <span class="p">):</span>
|
|
<span class="n">horizontals</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">component</span> <span class="ow">in</span> <span class="n">net</span><span class="o">.</span><span class="n">getComponents</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">component</span><span class="p">,</span><span class="n">Horizontal</span><span class="p">):</span>
|
|
<span class="n">horizontals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="n">component</span> <span class="p">)</span>
|
|
<span class="c1"># Now we can remove the Horizontals.</span>
|
|
<span class="k">for</span> <span class="n">horizontal</span> <span class="ow">in</span> <span class="n">horizontals</span><span class="p">:</span>
|
|
<span class="n">horizontal</span><span class="o">.</span><span class="n">destroy</span><span class="p">()</span>
|
|
</pre></div>
|
|
</blockquote>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last"><strong>Never remove an element from a Collection_ while iterating over it</strong>.
|
|
You must save the to be removed elements in an auxiliary container
|
|
then remove them, like shown in the example above</p>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="dynamically-decorating-data-base-objects">
|
|
<h3>1.5 Dynamically decorating data-base objects</h3>
|
|
<p>When writing algorithms directly in Python, it may come in handy to be
|
|
able to add attributes over the Hurricane data-base objects. As C++
|
|
objects exposed to the Python realm cannot natively do so (it would
|
|
means to be able to modify a C++ aobject attributes <em>at runtime</em>),
|
|
we add a special Property tasked with handling the extra Python
|
|
attributes. The syntax has been made as simple as possible.</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="n">PythonAttributes</span>
|
|
|
|
<span class="k">class</span> <span class="nc">MyAttribute</span> <span class="p">(</span> <span class="nb">object</span> <span class="p">):</span>
|
|
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span> <span class="p">(</span> <span class="bp">self</span> <span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="o">.</span><span class="n">count</span>
|
|
<span class="nb">print</span><span class="p">(</span> <span class="s1">'</span><span class="si">{}</span><span class="s1"> has been created'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">MyAttribute</span><span class="o">.</span><span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__del__</span> <span class="p">(</span> <span class="bp">self</span> <span class="p">):</span>
|
|
<span class="nb">print</span><span class="p">(</span> <span class="s1">'</span><span class="si">{}</span><span class="s1"> has been deleted'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span> <span class="p">(</span> <span class="bp">self</span> <span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">'<MyAttribute </span><span class="si">{}</span><span class="s1">>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">demoAttributes</span> <span class="p">(</span> <span class="n">cell</span> <span class="p">):</span>
|
|
<span class="n">PythonAttributes</span><span class="o">.</span><span class="n">enable</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
|
|
<span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="p">()</span>
|
|
<span class="n">cell</span><span class="o">.</span><span class="n">myAttribute1</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span> <span class="s1">'cell.myAttribute0 ='</span><span class="p">,</span> <span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span> <span class="p">)</span>
|
|
<span class="k">del</span> <span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span>
|
|
<span class="n">PythonAttributes</span><span class="o">.</span><span class="n">disable</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<p>Detailing the life cycle of Python attributes on a <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a>:</p>
|
|
<ol class="arabic">
|
|
<li><p class="first">Enabling the addition of Python attribute on a <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a>:</p>
|
|
<div class="highlight"><pre><span></span><span class="n">PythonAttributes</span><span class="o">.</span><span class="n">enable</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
|
|
</pre></div>
|
|
</li>
|
|
<li><p class="first">Adding/removing properties on the <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a>:</p>
|
|
<div class="highlight"><pre><span></span><span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="p">()</span>
|
|
<span class="n">cell</span><span class="o">.</span><span class="n">myAttribute1</span> <span class="o">=</span> <span class="n">MyAttribute</span><span class="p">()</span>
|
|
<span class="nb">print</span><span class="p">(</span> <span class="s1">'cell.myAttribute0 ='</span><span class="p">,</span> <span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span> <span class="p">)</span>
|
|
<span class="k">del</span> <span class="n">cell</span><span class="o">.</span><span class="n">myAttribute0</span>
|
|
</pre></div>
|
|
</li>
|
|
<li><p class="first">And finally disabling the use of Python attributes on the DBo.
|
|
Any still attached Python attributes will be released.</p>
|
|
<div class="highlight"><pre><span></span><span class="n">PythonAttributes</span><span class="o">.</span><span class="n">disable</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">When the attributes of a <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a> are released it does not automatically
|
|
imply that they are removed. Their reference count is decreased, and
|
|
if they are only referenced here, they will be deleted. But if other
|
|
variables still holds reference onto them, they will stay allocateds.</p>
|
|
</div>
|
|
</li>
|
|
<li><p class="first">There is no need to keep track of all the <a class="reference external" href="../../hurricane/classHurricane_1_1DBo.html">DBo</a> that have Python
|
|
attributes to disable them. One can directly call:</p>
|
|
<div class="highlight"><pre><span></span><span class="n">PythonAttributes</span><span class="o">.</span><span class="n">disableAll</span><span class="p">()</span>
|
|
</pre></div>
|
|
</li>
|
|
</ol>
|
|
</div>
|
|
<div class="section" id="adapting-c-overlay">
|
|
<h3>1.6 Adapting C++ : Overlay</h3>
|
|
<p>Sometimes, the use of a wrapped C++ feature would be counter intuitive regarding
|
|
the <span class="sc">Python</span> feature. For those cases the <span class="cb">overlay</span> module provide an
|
|
adaptation of the C++ API for a more <em>Python-like</em> code. A typical example is
|
|
with the <a class="reference external" href="../../hurricane/classHurricane_1_1UpdateSession.html">UpdateSession</a> mechanism.</p>
|
|
<p>Using directly the C++ wrapper, we would write a code like this:</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="n">UpdateSession</span><span class="p">,</span> <span class="n">Net</span><span class="p">,</span> <span class="n">Vertical</span>
|
|
<span class="kn">from</span> <span class="nn">helpers</span> <span class="kn">import</span> <span class="n">l</span>
|
|
|
|
<span class="k">def</span> <span class="nf">editCell</span> <span class="p">(</span> <span class="n">cell</span> <span class="p">):</span>
|
|
<span class="n">UpdateSession</span><span class="o">.</span><span class="n">open</span><span class="p">()</span>
|
|
<span class="n">net</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">"nwell"</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">net</span><span class="p">,</span> <span class="n">nwell</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">7.5</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">27.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">51.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="c1"># Continued cell's layout building.</span>
|
|
<span class="c1"># ...</span>
|
|
<span class="n">UpdateSession</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
|
</pre></div>
|
|
<p>But, using the <span class="cb">overlay</span> we got the more <em>pythonic</em> code:</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="n">Net</span><span class="p">,</span> <span class="n">Vertical</span>
|
|
<span class="kn">from</span> <span class="nn">helpers</span> <span class="kn">import</span> <span class="n">l</span>
|
|
<span class="kn">from</span> <span class="nn">helpers.overlay</span> <span class="kn">import</span> <span class="n">UpdateSession</span>
|
|
|
|
<span class="k">def</span> <span class="nf">editCell</span> <span class="p">(</span> <span class="n">cell</span> <span class="p">):</span>
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">net</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">"nwell"</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">net</span><span class="p">,</span> <span class="n">nwell</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">7.5</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">27.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">51.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="c1"># Continued cell's layout building.</span>
|
|
<span class="c1"># ...</span>
|
|
</pre></div>
|
|
<!-- -*- Mode: rst -*- -->
|
|
</div>
|
|
</div>
|
|
<div class="section" id="setting-up-the-environment">
|
|
<h2><a class="toc-backref" href="#id11">2. Setting up the Environment</a></h2>
|
|
<div class="section" id="setting-up-the-paths">
|
|
<h3>2.1 Setting up the Paths</h3>
|
|
<p>To simplify the tedious task of configuring your environment, a helper is provided.
|
|
It will setup or modify the <span class="cb">PATH</span>, <span class="cb">LD_LIBRARY_PATH</span> (or <span class="cb">DYLD_LIBRARY_PATH</span>
|
|
under <span class="sc">Darwin</span>), <span class="cb">PYTHONPATH</span> and <span class="cb">CORIOLIS_TOP</span> variables.
|
|
It should automatically adapt to your kind of shell (<tt class="docutils literal">Bourne</tt> like
|
|
or <tt class="docutils literal"><span class="pre">C-Shell</span></tt> like).</p>
|
|
<pre class="literal-block">
|
|
<CORIOLIS_INSTALL>/etc/coriolis2/coriolisEnv.py
|
|
</pre>
|
|
<p>Use it like this (don't forget the <tt class="docutils literal">eval</tt> <strong>and</strong> the backquotes):</p>
|
|
<div class="highlight"><pre><span></span><span class="go">dummy@lepka:~> eval `<CORIOLIS_INSTALL>/etc/coriolis2/coriolisEnv.py`</span>
|
|
</pre></div>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p><strong>Do not call that script in your environment initialisation.</strong>
|
|
When used under <span class="sc">rhel6</span> or clones, it needs to be run in the <span class="cb">devtoolset</span>
|
|
environment. The script then launches a new shell, which may cause an
|
|
infinite loop if it's called again in, say <span class="cb">~/.bashrc</span>.</p>
|
|
<p>Instead you may want to create an alias:</p>
|
|
<div class="last"><div class="highlight"><pre><span></span><span class="nb">alias</span> <span class="nv">c2r</span><span class="o">=</span><span class="s1">'eval "`<CORIOLIS_INSTALL>/etc/coriolis2/coriolisEnv.py`"'</span>
|
|
</pre></div>
|
|
</div></div>
|
|
</div>
|
|
<div class="section" id="user-s-configurations-file">
|
|
<h3>2.2 User's Configurations File</h3>
|
|
<p>You may create, in the directory you are lanching <span class="sc">Coriolis</span> tools, a special
|
|
sub-directory <tt class="docutils literal">coriolis2/</tt> that can contain the configuration files:</p>
|
|
<ul class="simple">
|
|
<li><tt class="docutils literal">__init__.py</tt> to tell <span class="sc">Python</span> this directory is a module.</li>
|
|
<li><tt class="docutils literal">settings.py</tt> can override almost any default configuration setting.</li>
|
|
</ul>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">Those two files will by processed by the <span class="sc">Python</span> interpreter,
|
|
so they can contain any code in addition to the mandatory
|
|
variables.</p>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="the-settings-py-file">
|
|
<h3>2.3 The <span class="cb">settings.py</span> File</h3>
|
|
<p>The attributes name and definitions of <span class="cb">cfg</span> are detailed
|
|
in <a class="reference external" href="../UsersGuide/ViewerTools.html">CGT - The Graphical Interface</a>.</p>
|
|
<p><strong>Selecting the Technology</strong></p>
|
|
<p>The important line here is:</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">symbolic.cmos</span>
|
|
</pre></div>
|
|
<p>This import loads and setup the technology used througout this run of
|
|
<span class="sc">Coriolis</span>. One and only one technology can be loaded in a <span class="sc">Coriolis</span> run.</p>
|
|
<p>Example of file:</p>
|
|
<div class="highlight"><pre><span></span><span class="c1"># -*- Mode:Python -*-</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">os</span>
|
|
<span class="kn">import</span> <span class="nn">Cfg</span>
|
|
<span class="kn">import</span> <span class="nn">Viewer</span>
|
|
<span class="kn">import</span> <span class="nn">CRL</span>
|
|
<span class="kn">import</span> <span class="nn">symbolic.cmos</span>
|
|
<span class="kn">from</span> <span class="nn">helpers</span> <span class="kn">import</span> <span class="n">overlay</span>
|
|
|
|
<span class="k">if</span> <span class="s1">'CELLS_TOP'</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span>
|
|
<span class="n">cellsTop</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'CELLS_TOP'</span><span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">cellsTop</span> <span class="o">=</span> <span class="s1">'../../../cells'</span>
|
|
|
|
<span class="k">with</span> <span class="n">overlay</span><span class="o">.</span><span class="n">CfgCache</span><span class="p">(</span><span class="n">priority</span><span class="o">=</span><span class="n">Cfg</span><span class="o">.</span><span class="n">Parameter</span><span class="o">.</span><span class="n">Priority</span><span class="o">.</span><span class="n">UserFile</span><span class="p">)</span> <span class="k">as</span> <span class="n">cfg</span><span class="p">:</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">misc</span><span class="o">.</span><span class="n">catchCore</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">misc</span><span class="o">.</span><span class="n">info</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">misc</span><span class="o">.</span><span class="n">paranoid</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">misc</span><span class="o">.</span><span class="n">bug</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">misc</span><span class="o">.</span><span class="n">logMode</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">misc</span><span class="o">.</span><span class="n">verboseLevel1</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">misc</span><span class="o">.</span><span class="n">verboseLevel2</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">misc</span><span class="o">.</span><span class="n">minTraceLevel</span> <span class="o">=</span> <span class="mi">1900</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">misc</span><span class="o">.</span><span class="n">maxTraceLevel</span> <span class="o">=</span> <span class="mi">3000</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">katana</span><span class="o">.</span><span class="n">eventsLimit</span> <span class="o">=</span> <span class="mi">1000000</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">katana</span><span class="o">.</span><span class="n">termSatReservedLocal</span> <span class="o">=</span> <span class="mi">6</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">katana</span><span class="o">.</span><span class="n">termSatThreshold</span> <span class="o">=</span> <span class="mi">9</span>
|
|
<span class="n">Viewer</span><span class="o">.</span><span class="n">Graphics</span><span class="o">.</span><span class="n">setStyle</span><span class="p">(</span> <span class="s1">'Alliance.Classic [black]'</span> <span class="p">)</span>
|
|
<span class="n">af</span> <span class="o">=</span> <span class="n">CRL</span><span class="o">.</span><span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
|
<span class="n">env</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getEnvironment</span><span class="p">()</span>
|
|
<span class="n">env</span><span class="o">.</span><span class="n">setCLOCK</span><span class="p">(</span> <span class="s1">'^ck$|m_clock|^clk$'</span> <span class="p">)</span>
|
|
<span class="n">env</span><span class="o">.</span><span class="n">addSYSTEM_LIBRARY</span><span class="p">(</span> <span class="n">library</span><span class="o">=</span><span class="n">cellsTop</span><span class="o">+</span><span class="s1">'/nsxlib'</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="n">CRL</span><span class="o">.</span><span class="n">Environment</span><span class="o">.</span><span class="n">Prepend</span> <span class="p">)</span>
|
|
<span class="n">env</span><span class="o">.</span><span class="n">addSYSTEM_LIBRARY</span><span class="p">(</span> <span class="n">library</span><span class="o">=</span><span class="n">cellsTop</span><span class="o">+</span><span class="s1">'/niolib'</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="n">CRL</span><span class="o">.</span><span class="n">Environment</span><span class="o">.</span><span class="n">Prepend</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<!-- -*- Mode: rst -*- -->
|
|
</div>
|
|
</div>
|
|
<div class="section" id="making-a-standard-cell-layout">
|
|
<h2><a class="toc-backref" href="#id12">3. Making a Standard Cell -- Layout</a></h2>
|
|
<p>In this part, we will show how to create and save a terminal <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a>,
|
|
that is, a cell without instances (the end point of a hierarchical
|
|
design). To illustrate the case we will draw the layout of a
|
|
standard cell.</p>
|
|
<p>We will introduce the following classes : <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a>, <a class="reference external" href="../../hurricane/classHurricane_1_1Net.html">Net</a>, <a class="reference external" href="../../hurricane/classHurricane_1_1Component.html">Component</a>
|
|
and its derived classes.</p>
|
|
<div class="section" id="the-allianceframework-crl-core">
|
|
<h3>3.1 The AllianceFramework (CRL Core)</h3>
|
|
<p>The <span class="sc">Hurricane</span> database only manages objects in memory. To load or save
|
|
something from the outside, we need to use a <em>framework</em>. As of today, only
|
|
one is available : the Alliance framework. It allows <span class="sc">Coriolis</span> to handle
|
|
<span class="sc">Alliance</span> libraries and cells in the exact same way.</p>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">To see how the <a class="reference external" href="../../crlcore/classCRL_1_1AllianceFramework.html">AllianceFramework</a> is configured for your
|
|
installation, please have a look to <tt class="docutils literal">alliance.conf</tt> in the
|
|
<tt class="docutils literal">etc/coriolis2</tt> directory. It must contains the same settings
|
|
as the various <tt class="docutils literal">MBK_</tt> variables used for <span class="sc">Alliance</span>.</p>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="session-mechanism-hurricane">
|
|
<h3>3.2 Session Mechanism (Hurricane)</h3>
|
|
<p>In the <span class="sc">Hurricane</span> database, all modifications must take place inside
|
|
an <a class="reference external" href="../../hurricane/classHurricane_1_1UpdateSession.html">UpdateSession</a>. At the closing of a session, created or modificated
|
|
objects are fully inserted in the database. This is especially true for
|
|
the visualisation, a created component will be visible <em>only</em> only after
|
|
the session close.</p>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">See <tt class="docutils literal">QuadTree</tt> and <tt class="docutils literal">Query</tt>.</p>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="creating-a-new-cell-crl-core">
|
|
<h3>3.3 Creating a new Cell (CRL Core)</h3>
|
|
<p>The creation of a new <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> occurs through the <a class="reference external" href="../../crlcore/classCRL_1_1AllianceFramework.html">AllianceFramework</a>,
|
|
and, as stated above, inside a <a class="reference external" href="../../hurricane/classHurricane_1_1UpdateSession.html">UpdateSession</a>. The <a class="reference external" href="../../crlcore/classCRL_1_1AllianceFramework.html">AllianceFramework</a>
|
|
environment is provided by the <span class="sc">crl</span> module.</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="o">*</span>
|
|
<span class="kn">from</span> <span class="nn">CRL</span> <span class="kn">import</span> <span class="o">*</span>
|
|
<span class="kn">from</span> <span class="nn">helpers.overlay</span> <span class="kn">import</span> <span class="n">UpdateSession</span>
|
|
|
|
<span class="n">af</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">cell</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">'my_inv'</span> <span class="p">)</span>
|
|
<span class="c1"># Build then save the Cell.</span>
|
|
</pre></div>
|
|
<p>This is the simplest call to <tt class="docutils literal">createCell()</tt>, and in that case, the newly
|
|
created <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> will be saved in the <em>working library</em> (usually, the current
|
|
directory). You may supply a second argument telling into which library
|
|
you want the <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> to be created.</p>
|
|
<p>In the <span class="sc">Hurricane</span> <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> object, there is no concept of <em>view</em>, it contains
|
|
completly fused logical (netlist) and physical (layout) views.</p>
|
|
</div>
|
|
<div class="section" id="the-dbu-measurement-unit">
|
|
<h3>3.4 The DbU Measurement Unit</h3>
|
|
<p>All coordinates in the <span class="sc">Hurricane</span> database are expressed in <a class="reference external" href="../../hurricane/classHurricane_1_1DbU.html">DbU</a>
|
|
(for <em>Database Unit</em>) which are integer numbers of foundry grid.
|
|
To be more precise, they are fixed points numbers expressed in
|
|
hundredth of foundry grid (to allow transient non-integer
|
|
computation).</p>
|
|
<p>To work with symbolic layout, that is, using lambda based lengths,
|
|
two conversion functions are provided:</p>
|
|
<ul class="simple">
|
|
<li><tt class="docutils literal">unit = DbU.fromLambda( lbd )</tt> convert a lambda <span class="cb">lbd</span> into a <tt class="docutils literal">DbU</tt>.</li>
|
|
<li><tt class="docutils literal">lbd = DbU.toLambda( unit )</tt> convert a <tt class="docutils literal">DbU</tt> into a lambda <span class="cb">lbd</span>.</li>
|
|
</ul>
|
|
<p>In the weakly typed <span class="sc">Python</span> world, <span class="cb">lbd</span> is <em>float</em> while <span class="cb">unit</span>
|
|
is <em>integer</em>.</p>
|
|
<p>In order to reduce the number of characters one has to code, the <span class="cb">helpers</span>
|
|
module provides three very short function to perform conversion <em>towards</em>
|
|
<a class="reference external" href="../../hurricane/classHurricane_1_1DbU.html">DbU</a> :</p>
|
|
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">l</span> <span class="p">(</span> <span class="n">value</span> <span class="p">):</span>
|
|
<span class="sd">"""Convert a lambda into a DbU."""</span>
|
|
<span class="k">return</span> <span class="n">DbU</span><span class="o">.</span><span class="n">fromLambda</span><span class="p">(</span> <span class="n">value</span> <span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">u</span> <span class="p">(</span> <span class="n">value</span> <span class="p">):</span>
|
|
<span class="sd">"""Convert a length in micrometer into a DbU."""</span>
|
|
<span class="k">return</span> <span class="n">DbU</span><span class="o">.</span><span class="n">fromPhysical</span><span class="p">(</span> <span class="n">value</span><span class="p">,</span> <span class="n">Hurricane</span><span class="o">.</span><span class="n">DbU</span><span class="o">.</span><span class="n">UnitPowerMicro</span> <span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">n</span> <span class="p">(</span> <span class="n">value</span> <span class="p">):</span>
|
|
<span class="sd">"""Convert a length in nanometer into a DbU."""</span>
|
|
<span class="k">return</span> <span class="n">DbU</span><span class="o">.</span><span class="n">fromPhysical</span><span class="p">(</span> <span class="n">value</span><span class="p">,</span> <span class="n">Hurricane</span><span class="o">.</span><span class="n">DbU</span><span class="o">.</span><span class="n">UnitPowerNano</span> <span class="p">)</span>
|
|
</pre></div>
|
|
</div>
|
|
<div class="section" id="setting-up-the-abutment-box">
|
|
<h3>3.5 Setting up the Abutment Box</h3>
|
|
<p>To setup the abutment box, we use a <a class="reference external" href="../../hurricane/classHurricane_1_1Box.html">Box</a> which defines a box from
|
|
the coordinates of the lower left corner <tt class="docutils literal">(x1,y1)</tt> and upper left
|
|
corner <tt class="docutils literal">(x2,y2)</tt>.</p>
|
|
<div class="highlight"><pre><span></span><span class="n">b</span> <span class="o">=</span> <span class="n">Box</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">)</span> <span class="c1"># x1</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">)</span> <span class="c1"># y1</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">15.0</span><span class="p">)</span> <span class="c1"># x2</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span> <span class="p">)</span> <span class="c1"># y2</span>
|
|
<span class="n">cell</span><span class="o">.</span><span class="n">setAbutmentBox</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<p>Or more simply:</p>
|
|
<div class="highlight"><pre><span></span><span class="n">cell</span><span class="o">.</span><span class="n">setAbutmentBox</span><span class="p">(</span> <span class="n">Box</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span> <span class="p">)</span> <span class="p">)</span>
|
|
</pre></div>
|
|
</div>
|
|
<div class="section" id="adding-nets-and-components">
|
|
<h3>3.6 Adding Nets and Components</h3>
|
|
<p>In the <span class="sc">Hurricane</span> terminology, a <strong>component</strong> is any kind of physical object
|
|
among:</p>
|
|
<ul class="simple">
|
|
<li><a class="reference external" href="../../hurricane/classHurricane_1_1Contact.html">Contact</a></li>
|
|
<li><a class="reference external" href="../../hurricane/classHurricane_1_1Pad.html">Pad</a></li>
|
|
<li><a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a></li>
|
|
<li><a class="reference external" href="../../hurricane/classHurricane_1_1Horizontal.html">Horizontal</a></li>
|
|
<li><a class="reference external" href="../../hurricane/classHurricane_1_1Vertical.html">Vertical</a></li>
|
|
<li><a class="reference external" href="../../hurricane/classHurricane_1_1Plug.html">Plug</a> is the only exception and will be detailed later (see ??).</li>
|
|
</ul>
|
|
<p><a class="reference external" href="../../hurricane/classHurricane_1_1Component.html">Components</a> cannot be created <em>alone</em>. They must be part of a <a class="reference external" href="../../hurricane/classHurricane_1_1Net.html">Net</a>.</p>
|
|
<div class="section" id="getting-a-layer">
|
|
<h4>3.6.1 Getting a Layer</h4>
|
|
<p>As physical elements, <a class="reference external" href="../../hurricane/classHurricane_1_1Component.html">Components</a> are created using a <a class="reference external" href="../../hurricane/classHurricane_1_1Layer.html">Layer</a>. So prior to
|
|
their creation, we must get one from the database. <a class="reference external" href="../../hurricane/classHurricane_1_1Layer.html">Layers</a> are stored in the
|
|
<a class="reference external" href="../../hurricane/classHurricane_1_1Technology.html">Technology</a>, which in turn, is stored in the <a class="reference external" href="../../hurricane/classHurricane_1_1DataBase.html">DataBase</a>. So, to get a
|
|
<a class="reference external" href="../../hurricane/classHurricane_1_1Layer.html">Layer</a>:</p>
|
|
<div class="highlight"><pre><span></span><span class="n">layer</span> <span class="o">=</span> <span class="n">DataBase</span><span class="o">.</span><span class="n">getDB</span><span class="p">()</span><span class="o">.</span><span class="n">getTechnology</span><span class="p">()</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s1">'METAL1'</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p><strong>Convention for layer names.</strong> As the database can manage both real layers
|
|
and symbolic ones we adopt the following convention:</p>
|
|
<ul class="last simple">
|
|
<li><strong>Real layers</strong> are named in lowercase (<tt class="docutils literal">metal1</tt>, <tt class="docutils literal">nwell</tt>).</li>
|
|
<li><strong>Symbolic layers</strong> are named in uppercase (<tt class="docutils literal">METAL1</tt>, <tt class="docutils literal">NWELL</tt>).</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="creating-a-net">
|
|
<h4>3.6.2 Creating a Net</h4>
|
|
<p>As said above, prior to creating any <a class="reference external" href="../../hurricane/classHurricane_1_1Component.html">Component</a>, we must create the <a class="reference external" href="../../hurricane/classHurricane_1_1Net.html">Net</a> it
|
|
will belong to. In that example we also make it an <em>external</em> net, that is,
|
|
a part of the interface. Do not mistake the name of the net given as a string
|
|
argument <span class="cb">'i'</span> and the name of the <em>variable</em> <span class="cb">i</span> holding the <a class="reference external" href="../../hurricane/classHurricane_1_1Net.html">Net</a> object.
|
|
For the sake of clarity we try to give the variable a close name, but this is
|
|
not mandatory.</p>
|
|
<div class="highlight"><pre><span></span><span class="n">i</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s1">'i'</span> <span class="p">)</span>
|
|
<span class="n">i</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">Unlike some other database models, in <span class="sc">Hurricane</span>,
|
|
<strong>there is no explicit terminal object</strong>, you only need to make the
|
|
net external. For more information about how to connect to an
|
|
external net, see <a class="reference external" href="./Netlist.html#id1">6.2 Creating Nets and connecting to Instances</a>.</p>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="id2">
|
|
<h4>3.6.3 Creating a Component</h4>
|
|
<p>Finally, we get ready to create a <a class="reference external" href="../../hurricane/classHurricane_1_1Component.html">Component</a>, we will make a <a class="reference external" href="../../hurricane/classHurricane_1_1Vertical.html">Vertical</a> segment
|
|
of <tt class="docutils literal">METAL1</tt>.</p>
|
|
<div class="highlight"><pre><span></span><span class="n">segment</span> <span class="o">=</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">i</span> <span class="c1"># The owner Net.</span>
|
|
<span class="p">,</span> <span class="n">layer</span> <span class="c1"># The layer.</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">5.0</span> <span class="p">)</span> <span class="c1"># The X coordinate.</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">2.0</span> <span class="p">)</span> <span class="c1"># The width.</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">10.0</span> <span class="p">)</span> <span class="c1"># The Y source coordinate.</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">40.0</span> <span class="p">)</span> <span class="p">)</span> <span class="c1"># The Y target coordinate.</span>
|
|
</pre></div>
|
|
<p>With this overload of the <tt class="docutils literal">Vertical.create()</tt> function the segment is created at an
|
|
absolute position. There is a second overload for creating a relatively placed
|
|
segment, see <em>articulated layout</em>.</p>
|
|
<p>If the net is external, that is, part of the interface of the cell, you may have
|
|
to declare some of its components as physical connectors usable by the router.
|
|
This is done by calling the <a class="reference external" href="../../hurricane/classHurricane_1_1NetExternalComponents.html">NetExternalComponents</a> class:</p>
|
|
<div class="highlight"><pre><span></span><span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">segment</span> <span class="p">)</span>
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="saving-to-disk-crl-core">
|
|
<h3>3.7 Saving to Disk (CRL Core)</h3>
|
|
<p>Once you have finished to build your cell, you have to save it on disk.
|
|
Using the <a class="reference external" href="../../crlcore/classCRL_1_1AllianceFramework.html">AllianceFramework</a> you can save it as a pair of file:</p>
|
|
<table class="table">
|
|
<colgroup>
|
|
<col width="30%" />
|
|
<col width="42%" />
|
|
<col width="28%" />
|
|
</colgroup>
|
|
<thead valign="bottom">
|
|
<tr><th class="head">View</th>
|
|
<th class="head">Flag</th>
|
|
<th class="head">File extension</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody valign="top">
|
|
<tr><td>Logical / Netlist</td>
|
|
<td><tt class="docutils literal">Catalog.State.Logical</tt></td>
|
|
<td><tt class="docutils literal">.vst</tt></td>
|
|
</tr>
|
|
<tr><td>Physical / Layout</td>
|
|
<td><tt class="docutils literal">Catalog.State.Physical</tt></td>
|
|
<td><tt class="docutils literal">.ap</tt></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>To save both views, use the <tt class="docutils literal">Catalog.State.Views</tt> flag. The files
|
|
will be written in the <span class="sc">Alliance</span> <tt class="docutils literal">WORK_DIR</tt>.</p>
|
|
<div class="highlight"><pre><span></span><span class="n">af</span><span class="o">.</span><span class="n">saveCell</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
</pre></div>
|
|
</div>
|
|
<div class="section" id="the-complete-example-file">
|
|
<h3>3.8 The Complete Example File</h3>
|
|
<p>The example files can be found in the <tt class="docutils literal">share/doc/coriolis2/examples/scripts/</tt>
|
|
directory (under the the root of the <span class="sc">Coriolis</span> installation).</p>
|
|
<p>The code needed to run it through the <span class="cb">cgt</span> viewer has been added. For the
|
|
explanation of that part of the code, refer to <a class="reference external" href="./CgtScript.html">5. Make a script runnable through cgt</a>.</p>
|
|
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">sys</span>
|
|
<span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="n">DataBase</span><span class="p">,</span> <span class="n">NetExternalComponents</span><span class="p">,</span> <span class="n">Net</span><span class="p">,</span> \
|
|
<span class="n">DbU</span><span class="p">,</span> <span class="n">Point</span><span class="p">,</span> <span class="n">Box</span><span class="p">,</span> <span class="n">Horizontal</span><span class="p">,</span> <span class="n">Vertical</span><span class="p">,</span> <span class="n">Contact</span><span class="p">,</span> <span class="n">RoutingPad</span><span class="p">,</span> \
|
|
<span class="n">Breakpoint</span>
|
|
<span class="kn">from</span> <span class="nn">CRL</span> <span class="kn">import</span> <span class="n">AllianceFramework</span><span class="p">,</span> <span class="n">Catalog</span>
|
|
<span class="kn">from</span> <span class="nn">helpers</span> <span class="kn">import</span> <span class="n">l</span>
|
|
<span class="kn">from</span> <span class="nn">helpers.overlay</span> <span class="kn">import</span> <span class="n">UpdateSession</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">doBreak</span> <span class="p">(</span> <span class="n">level</span><span class="p">,</span> <span class="n">message</span> <span class="p">):</span>
|
|
<span class="sd">"""Put a breakpoint into the script."""</span>
|
|
<span class="n">Breakpoint</span><span class="o">.</span><span class="n">stop</span><span class="p">(</span> <span class="n">level</span><span class="p">,</span> <span class="n">message</span> <span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">buildInvertor</span> <span class="p">(</span> <span class="n">editor</span> <span class="p">):</span>
|
|
<span class="sd">"""Build step by step an invertor standard cell."""</span>
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">cell</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">'invertor'</span> <span class="p">)</span>
|
|
<span class="n">cell</span><span class="o">.</span><span class="n">setTerminalNetlist</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">cell</span><span class="o">.</span><span class="n">setAbutmentBox</span><span class="p">(</span> <span class="n">Box</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span> <span class="p">)</span> <span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">editor</span><span class="p">:</span>
|
|
<span class="n">editor</span><span class="o">.</span><span class="n">setCell</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
|
|
<span class="n">editor</span><span class="o">.</span><span class="n">fit</span><span class="p">()</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">technology</span> <span class="o">=</span> <span class="n">DataBase</span><span class="o">.</span><span class="n">getDB</span><span class="p">()</span><span class="o">.</span><span class="n">getTechnology</span><span class="p">()</span>
|
|
<span class="n">metal1</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"METAL1"</span> <span class="p">)</span>
|
|
<span class="n">poly</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"POLY"</span> <span class="p">)</span>
|
|
<span class="n">ptrans</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"PTRANS"</span> <span class="p">)</span>
|
|
<span class="n">ntrans</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"NTRANS"</span> <span class="p">)</span>
|
|
<span class="n">pdif</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"PDIF"</span> <span class="p">)</span>
|
|
<span class="n">ndif</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"NDIF"</span> <span class="p">)</span>
|
|
<span class="n">contdifn</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"CONT_DIF_N"</span> <span class="p">)</span>
|
|
<span class="n">contdifp</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"CONT_DIF_P"</span> <span class="p">)</span>
|
|
<span class="n">nwell</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"NWELL"</span> <span class="p">)</span>
|
|
<span class="n">contpoly</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"CONT_POLY"</span> <span class="p">)</span>
|
|
<span class="n">ntie</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"NTIE"</span> <span class="p">)</span>
|
|
|
|
<span class="n">net</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">"nwell"</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">net</span><span class="p">,</span> <span class="n">nwell</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">7.5</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">27.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">51.0</span><span class="p">)</span> <span class="p">)</span>
|
|
|
|
<span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">"vdd"</span> <span class="p">)</span>
|
|
<span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">h</span> <span class="o">=</span> <span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">vdd</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">47.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">6.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">15.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">h</span> <span class="p">)</span>
|
|
<span class="n">Contact</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">vdd</span><span class="p">,</span> <span class="n">contdifn</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">47.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Contact</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">vdd</span><span class="p">,</span> <span class="n">contdifp</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">4.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">45.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">vdd</span><span class="p">,</span> <span class="n">pdif</span> <span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">3.5</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">4.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">28.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">46.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">vdd</span><span class="p">,</span> <span class="n">ntie</span> <span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">3.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">43.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">48.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Done building vdd.'</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">vss</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">"vss"</span> <span class="p">)</span>
|
|
<span class="n">vss</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">vss</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">h</span> <span class="o">=</span> <span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">vss</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">3.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">6.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">15.0</span><span class="p">))</span>
|
|
<span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">h</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">vss</span><span class="p">,</span> <span class="n">ndif</span> <span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">3.5</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">4.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">4.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">12.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Contact</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">vss</span><span class="p">,</span> <span class="n">contdifn</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">4.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">5.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Done building vss.'</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">i</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">"i"</span> <span class="p">)</span>
|
|
<span class="n">i</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">v</span> <span class="o">=</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">5.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">2.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">40.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">v</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">ptrans</span> <span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">7.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">26.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">39.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">ntrans</span> <span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">7.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">6.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">14.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">poly</span> <span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">7.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">14.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">26.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">poly</span> <span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">20.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">3.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">4.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">7.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Contact</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">i</span><span class="p">,</span> <span class="n">contpoly</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">5.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">20.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Done building i.'</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">nq</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="s2">"nq"</span> <span class="p">)</span>
|
|
<span class="n">nq</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">v</span> <span class="o">=</span> <span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">metal1</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">2.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">40.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">NetExternalComponents</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="n">v</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">pdif</span> <span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">3.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">28.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">37.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">ndif</span> <span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">3.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">8.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">12.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Contact</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">contdifp</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">35.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Contact</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">contdifp</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">30.5</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Contact</span><span class="o">.</span><span class="n">create</span> <span class="p">(</span> <span class="n">nq</span><span class="p">,</span> <span class="n">contdifn</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">1.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Done building q.'</span> <span class="p">)</span>
|
|
|
|
<span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span><span class="o">.</span><span class="n">saveCell</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span>
|
|
<span class="sd">"""The Mandatory function to be run by Coriolis interactively."""</span>
|
|
<span class="n">editor</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="s1">'editor'</span> <span class="ow">in</span> <span class="n">kw</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'editor'</span><span class="p">]:</span>
|
|
<span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'editor'</span><span class="p">]</span>
|
|
<span class="n">buildInvertor</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
</pre></div>
|
|
<!-- -*- Mode: rst -*- -->
|
|
</div>
|
|
</div>
|
|
<div class="section" id="manipulating-cells-nets-and-components">
|
|
<h2><a class="toc-backref" href="#id13">4. Manipulating Cells, Nets and Components</a></h2>
|
|
<p>In this part, we will show how to navigate through the <a class="reference external" href="../../hurricane/classHurricane_1_1Net.html">Nets</a> and <a class="reference external" href="../../hurricane/classHurricane_1_1Component.html">Components</a> of a <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a>.</p>
|
|
<div class="section" id="hurricane-collections">
|
|
<h3>4.1 Hurricane Collections</h3>
|
|
<p>In <span class="sc">Hurricane</span> all kind of set of objects, whether organized in a real container
|
|
like a <tt class="docutils literal">map<></tt> (dictionary / <tt class="docutils literal">dict</tt>) or a <tt class="docutils literal">vector<></tt> (table / <tt class="docutils literal">list</tt>) or
|
|
an algorithmic walkthrough of the database can be accessed through a <a class="reference external" href="../../hurricane/classHurricane_1_1Collection.html">Collection</a>.</p>
|
|
<p>C++ Collections objects are exposed in <span class="sc">Python</span> through the <em>iterable</em> protocol,
|
|
allowing to simply write:</p>
|
|
<div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">net</span> <span class="ow">in</span> <span class="n">cell</span><span class="o">.</span><span class="n">getNets</span><span class="p">():</span>
|
|
<span class="nb">print</span><span class="p">(</span> <span class="s1">'Components of'</span><span class="p">,</span> <span class="n">net</span> <span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">component</span> <span class="ow">in</span> <span class="n">net</span><span class="o">.</span><span class="n">getComponents</span><span class="p">():</span>
|
|
<span class="nb">print</span><span class="p">(</span> <span class="s1">'|'</span><span class="p">,</span> <span class="n">component</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<p>In C++ we would have been written:</p>
|
|
<div class="highlight"><pre><span></span><span class="k">for</span> <span class="p">(</span> <span class="n">Net</span><span class="o">*</span> <span class="nl">net</span> <span class="p">:</span> <span class="n">cell</span><span class="o">-></span><span class="n">getNets</span><span class="p">()</span> <span class="p">)</span> <span class="p">{</span>
|
|
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"Components of "</span> <span class="o"><<</span> <span class="n">net</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
|
|
<span class="k">for</span> <span class="p">(</span> <span class="n">Component</span><span class="o">*</span> <span class="nl">component</span> <span class="p">:</span> <span class="n">net</span><span class="o">-></span><span class="n">getComponents</span><span class="p">()</span> <span class="p">)</span> <span class="p">{</span>
|
|
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"| "</span> <span class="o"><<</span> <span class="n">component</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">,</span>
|
|
<span class="p">}</span>
|
|
<span class="p">}</span>
|
|
</pre></div>
|
|
<div class="section" id="restrictions-about-using-collections">
|
|
<h4>4.1.1 Restrictions about using Collections</h4>
|
|
<p><strong>Never delete or create an element while you are iterating over a Collection.</strong></p>
|
|
<p>Results can be unpredictable, you may just end up with a core dump, but more
|
|
subtly, some element of the <a class="reference external" href="../../hurricane/classHurricane_1_1Collection.html">Collection</a> may be skipped or processed twice.
|
|
If you want to create or delete an element, do it outside the collection
|
|
loop. For example:</p>
|
|
<div class="highlight"><pre><span></span><span class="n">cellNets</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">net</span> <span class="ow">in</span> <span class="n">cell</span><span class="o">.</span><span class="n">getNets</span><span class="p">():</span>
|
|
<span class="n">cellNets</span><span class="o">.</span><span class="n">append</span><span class="p">(</span> <span class="n">net</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Remove all the anonymous nets.</span>
|
|
<span class="k">for</span> <span class="n">net</span> <span class="ow">in</span> <span class="n">cellNets</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">net</span><span class="o">.</span><span class="n">getName</span><span class="p">()</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'nymous_'</span><span class="p">):</span>
|
|
<span class="nb">print</span><span class="p">(</span> <span class="s1">'Destroy'</span><span class="p">,</span> <span class="n">net</span> <span class="p">)</span>
|
|
<span class="n">net</span><span class="o">.</span><span class="n">destroy</span><span class="p">()</span>
|
|
</pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="loading-a-cell-with-allianceframework">
|
|
<h3>4.2 Loading a Cell with AllianceFramework</h3>
|
|
<p>As presented in <a class="reference external" href="./CellNetComponent.html#the-allianceframework-crl-core">2.1 The Alliance Framework</a>, the <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> that will be returned by
|
|
the <tt class="docutils literal">getCell()</tt> call wil be:</p>
|
|
<ol class="arabic">
|
|
<li><p class="first">If a <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> of that name is already loaded into memory, it will be returned.</p>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">It means that it shadows any modifications that could have been on
|
|
disk since it was first loaded. Conversely, if the <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> has been
|
|
modified in memory, you will get those modifications.</p>
|
|
</div>
|
|
</li>
|
|
<li><p class="first">Search, in the ordered list of libraries, the first <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> that matches the
|
|
requested name.</p>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">It means that if cells with the same name exist in different
|
|
libraries, only the one in the first library will be ever used.
|
|
Be also aware that cell files that may remain in the <tt class="docutils literal">WORK_LIB</tt>,
|
|
may unexpectedly shadow cells from the libraries.</p>
|
|
</div>
|
|
</li>
|
|
</ol>
|
|
<div class="highlight"><pre><span></span><span class="n">cell</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'inv_x1'</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<!-- -*- Mode: rst -*- -->
|
|
</div>
|
|
</div>
|
|
<div class="section" id="id3">
|
|
<h2><a class="toc-backref" href="#id14">5. Make a script runnable through <span class="cb">cgt</span></a></h2>
|
|
<p>To use your script you may run it directly like any other <span class="sc">Python</span> script.
|
|
But, for debugging purpose it may be helpful to run it through the
|
|
interactive layout viewer <span class="cb">cgt</span>.</p>
|
|
<p>For <span class="cb">cgt</span> to be able to run your script, you must add to your script
|
|
file a function named <span class="cb">scriptMain()</span>, which takes a dictionary
|
|
as sole argument (<span class="cb">**kw</span>). The <tt class="docutils literal">kw</tt> dictionary contains, in
|
|
particular, the <a class="reference external" href="../../viewer/classHurricane_1_1CellViewer.html">CellViewer</a> object we are running under with the
|
|
keyword <tt class="docutils literal">editor</tt>. You can then load your cell into the viewer
|
|
using the menu:</p>
|
|
<ul class="simple">
|
|
<li><span class="fboxtt">Tools</span> <span class="formula"> → </span> <span class="fboxtt">Python Script</span>. The script
|
|
file name must be given without the <tt class="docutils literal">.py</tt> extension.</li>
|
|
</ul>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p>If you use breakpoints and want to see the progress of your
|
|
script in the viewer, do not use the <tt class="docutils literal"><span class="pre">--script</span></tt> option of
|
|
<span class="cb">cgt</span>.</p>
|
|
<div class="highlight"><pre><span></span><span class="go">ego@home:~> cgt -V --script=invertor</span>
|
|
</pre></div>
|
|
<p class="last">Because the script is run <strong>before</strong> the viewer is launched,
|
|
you will only see the end result of your script.</p>
|
|
</div>
|
|
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">buildInvertor</span> <span class="p">(</span> <span class="n">editor</span> <span class="p">):</span>
|
|
<span class="sd">"""Build step by step an invertor standard cell."""</span>
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">cell</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">'invertor'</span> <span class="p">)</span>
|
|
<span class="n">cell</span><span class="o">.</span><span class="n">setTerminalNetlist</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
|
|
<span class="n">cell</span><span class="o">.</span><span class="n">setAbutmentBox</span><span class="p">(</span> <span class="n">Box</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">15.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span> <span class="p">)</span> <span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">editor</span><span class="p">:</span>
|
|
<span class="n">editor</span><span class="o">.</span><span class="n">setCell</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
|
|
<span class="n">editor</span><span class="o">.</span><span class="n">fit</span><span class="p">()</span>
|
|
|
|
<span class="c1"># The rest of the script...</span>
|
|
<span class="k">return</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span>
|
|
<span class="sd">"""The Mandatory function to be run by Coriolis interactively."""</span>
|
|
<span class="n">editor</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="s1">'editor'</span> <span class="ow">in</span> <span class="n">kw</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'editor'</span><span class="p">]:</span>
|
|
<span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'editor'</span><span class="p">]</span>
|
|
<span class="n">buildInvertor</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
</pre></div>
|
|
<div class="section" id="using-breakpoints">
|
|
<h3>5.1 Using Breakpoints</h3>
|
|
<p>It is possible to add breakpoints inside a script by calling the <tt class="docutils literal">Breakpoint.stop()</tt>
|
|
function. To be able to see exactly what has just been modified, be sure to have
|
|
closed any <a class="reference external" href="../../hurricane/classHurricane_1_1UpdateSession.html">UpdateSession</a> before calling breakpoints.
|
|
The <tt class="docutils literal">Breakpoint.stop()</tt> function takes two arguments:</p>
|
|
<ol class="arabic simple">
|
|
<li>The <tt class="docutils literal">level</tt> above which it will be active.</li>
|
|
<li>An informative message about the purpose of the breakpoint.</li>
|
|
</ol>
|
|
<p>We can create a little function to ease the work:</p>
|
|
<div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">doBreak</span> <span class="p">(</span> <span class="n">level</span><span class="p">,</span> <span class="n">message</span> <span class="p">):</span>
|
|
<span class="n">Breakpoint</span><span class="o">.</span><span class="n">stop</span><span class="p">(</span> <span class="n">level</span><span class="p">,</span> <span class="n">message</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<!-- -*- Mode: rst -*- -->
|
|
</div>
|
|
</div>
|
|
<div class="section" id="making-a-hierarchical-cell-netlist">
|
|
<h2><a class="toc-backref" href="#id15">6. Making a hierarchical Cell -- Netlist</a></h2>
|
|
<p>To illustrate the topic, we will build the netlist of a fulladder from
|
|
standard cell.</p>
|
|
<p><img alt="The fulladder netlist" class="align-middle" src="../pages/images/fulladder-1.png" style="width: 80%;" /></p>
|
|
<div class="section" id="creating-an-instance">
|
|
<h3>6.1 Creating an <a class="reference external" href="../../hurricane/classHurricane_1_1Instance.html">Instance</a></h3>
|
|
<p>Creating an <a class="reference external" href="../../hurricane/classHurricane_1_1Instance.html">Instance</a> is straigthforward, the constructor needs only three
|
|
parameters:</p>
|
|
<ol class="arabic simple">
|
|
<li>The <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> <strong>into which</strong> the instance is to be created.</li>
|
|
<li>The name of the instance.</li>
|
|
<li>The <strong>master cell</strong>, the <a class="reference external" href="../../hurricane/classHurricane_1_1Cell.html">Cell</a> model it refers to. The master cell
|
|
will be part of the hierarchical level just below the <tt class="docutils literal">fulladder</tt>
|
|
cell.</li>
|
|
</ol>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">Do not confuse the cell the instance is create into (<tt class="docutils literal">fulladder</tt>)
|
|
and the cells it refers to (the <em>master cell</em> <tt class="docutils literal">xr2_x2</tt>).</p>
|
|
</div>
|
|
<div class="highlight"><pre><span></span><span class="n">af</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
|
<span class="n">xr2_x2</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'xr2_x1'</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
|
|
<span class="n">fulladder</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">'fulladder'</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'xr2_1'</span><span class="p">,</span> <span class="n">xr2_x2</span> <span class="p">)</span>
|
|
</pre></div>
|
|
</div>
|
|
<div class="section" id="id4">
|
|
<h3>6.2 Creating Nets and connecting to Instances</h3>
|
|
<p>An <a class="reference external" href="../../hurricane/classHurricane_1_1Instance.html">Instance</a> has one <a class="reference external" href="../../hurricane/classHurricane_1_1Plug.html">Plug</a> for each external net of the <em>master cell</em>.
|
|
The plug allows to create a <strong>logical</strong> connection bewteen a <a class="reference external" href="../../hurricane/classHurricane_1_1Net.html">Net</a> of
|
|
<tt class="docutils literal">fulladder</tt> and a net from an <a class="reference external" href="../../hurricane/classHurricane_1_1Instance.html">Instance</a> <em>master cell</em>.</p>
|
|
<p>A plug is somewhat equivalent to an <em>instance terminal</em> in other
|
|
well known databases.</p>
|
|
<p>Therefore, a plug is related to two nets:</p>
|
|
<ol class="arabic simple">
|
|
<li>The net of the <em>master cell</em> it is linked to. Obviously that
|
|
net cannot be changed. You can access the master net with the
|
|
function <tt class="docutils literal">plug.getMasterNet()</tt>.</li>
|
|
<li>The net of <tt class="docutils literal">fulladder</tt> the plug is connected to. This can
|
|
be set, it is how we build the netlist. To set the net, use
|
|
the function <tt class="docutils literal">plug.setNet( net )</tt>. If the argument is <tt class="docutils literal">None</tt>,
|
|
the plug is <em>disconnected</em>.</li>
|
|
</ol>
|
|
<p>To find the plug of an instance associated to a given net in
|
|
the <em>master cell</em>, use <tt class="docutils literal">instance.getPlug( masterNet )</tt>.
|
|
The <tt class="docutils literal">masterNet</tt> argument being an object of class net (not
|
|
its name).</p>
|
|
<p>Building the <span class="cb">a</span> net of <tt class="docutils literal">fulladder</tt>:</p>
|
|
<div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">"a"</span> <span class="p">)</span>
|
|
<span class="n">a</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">"i0"</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
|
|
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">"i0"</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p><strong>Limitation of Hurricane Netlists.</strong> There is no explicit
|
|
terminal object in the <span class="sc">Hurricane</span> database. Plugs are
|
|
generated <em>on the fly</em> for each <em>external net</em> of the
|
|
instance. One important consequence is that a <em>net</em>
|
|
cannot appear on the interface as two differently named
|
|
terminals (sometimes referred as <em>weekly connected</em>
|
|
terminals). There is a strict bijection between external
|
|
nets and plugs.</p>
|
|
<p class="last">While it may be restrictive, it enforces cleaner designs
|
|
and make it possible for the <a class="reference external" href="../../hurricane/classHurricane_1_1HyperNet.html">HyperNet</a> concept/class.</p>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="power-supplies-special-case">
|
|
<h3>6.3 Power supplies special case</h3>
|
|
<p>For supplies, it may be tedious to connect the <a class="reference external" href="../../hurricane/classHurricane_1_1Plug.html">Plugs</a> of each cell one by one
|
|
(and create a lot of unneeded objects). To avoid that, we may use <strong>Named
|
|
connections</strong>. If a signal in <tt class="docutils literal">fulladder</tt> is set to <em>global</em>, then it will
|
|
be considered as connected to any signal with the <em>same name</em> and <em>global</em> in
|
|
the master cell of the instances.</p>
|
|
<div class="highlight"><pre><span></span><span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">"vdd"</span> <span class="p">)</span>
|
|
<span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span> <span class="c1"># Will be connected to all the instances.</span>
|
|
</pre></div>
|
|
</div>
|
|
<div class="section" id="creating-the-physical-view-of-a-cell-netlist">
|
|
<h3>6.4 Creating the physical view of a Cell netlist</h3>
|
|
<p>Even if loaded in the viewer, an Instance will not be displayed
|
|
until it is placed.</p>
|
|
<div class="section" id="id5">
|
|
<h4>6.4.1 Transformation</h4>
|
|
<p>To place an Instance, we apply a <a class="reference external" href="../../hurricane/classHurricane_1_1Transformation.html">Transformation</a> to the coordinate system
|
|
of the <em>master cell</em>. A transformation is composed of two operations:</p>
|
|
<ol class="arabic simple">
|
|
<li>An <a class="reference external" href="../../hurricane/classHurricane_1_1Orientation.html">Orientation</a>, which can be a symmetry or a rotation (or a combination
|
|
of those two). The Orientation <strong>is applied first</strong> to the coordinate
|
|
system of the <em>master cell</em>. The complete list of Orientation and their
|
|
codes are given on the Orientation documentation page.</li>
|
|
<li>A <strong>Translation</strong>, applied in second. Translation are represented by
|
|
<a class="reference external" href="../../hurricane/classHurricane_1_1Point.html">Points</a>.</li>
|
|
</ol>
|
|
<p>The transformation is a change of coordinate system, be aware that if the
|
|
abutment box lower left corner of the <em>master</em> cell is <strong>not</strong> at <tt class="docutils literal">(0,0)</tt>
|
|
the result of the Transformation may not be what you expect. To simplify
|
|
the computation of the transformation of an instance, always place the
|
|
lower left corner of the abutment box at <tt class="docutils literal">(0,0)</tt></p>
|
|
</div>
|
|
<div class="section" id="placing-an-instance">
|
|
<h4>6.4.2 Placing an Instance</h4>
|
|
<p>Assuming that we want to place the cells of the <tt class="docutils literal">fulladder</tt> into two rows,
|
|
that the abutment box lower left corner is at <tt class="docutils literal">(0,0)</tt> (same for the
|
|
<tt class="docutils literal">xr2_x2</tt> <em>master cell</em> layout). Here is the code to place the <tt class="docutils literal">xr2_1</tt>
|
|
instance to left of the second row.</p>
|
|
<p>Setting the translation on an <a class="reference external" href="../../hurricane/classHurricane_1_1Instance.html">Instance</a> is not enough to make it be displayed,
|
|
we also must set its <em>placement status</em> to <tt class="docutils literal">Instance.PlacementStatus.PLACED</tt>.</p>
|
|
<div class="highlight"><pre><span></span><span class="n">xr2_1</span><span class="o">.</span><span class="n">setTransformation</span><span class="p">(</span> <span class="n">Transformation</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">100.0</span><span class="p">),</span> <span class="n">Transformation</span><span class="o">.</span><span class="n">Orientation</span><span class="o">.</span><span class="n">MY</span> <span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">setPlacementStatus</span><span class="p">(</span> <span class="n">Instance</span><span class="o">.</span><span class="n">PlacementStatus</span><span class="o">.</span><span class="n">PLACED</span> <span class="p">)</span>
|
|
</pre></div>
|
|
</div>
|
|
<div class="section" id="nets-from-plugs-to-routingpads">
|
|
<h4>6.4.3 Nets -- From Plugs to RoutingPads</h4>
|
|
<p>As was stated before, <a class="reference external" href="../../hurricane/classHurricane_1_1Plug.html">Plugs</a> represent a logical connection between two
|
|
levels of hierarchy. To make the physical connection to the <em>master net</em>
|
|
in the instance, we now must create, in the <tt class="docutils literal">fulladder</tt>, a special
|
|
component which is a kind of <em>reference</em> to a component of the
|
|
<em>master net</em> (in the master cell).</p>
|
|
<p>The so called <em>special component</em> is a <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a>.</p>
|
|
<p>The <tt class="docutils literal">RoutingPad</tt> can be considered as an equivalent to <tt class="docutils literal">pin</tt> in other
|
|
well known databases.</p>
|
|
<div class="highlight"><pre><span></span><span class="n">rp</span> <span class="o">=</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">a</span>
|
|
<span class="p">,</span> <span class="n">Occurrence</span><span class="p">(</span> <span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">"i0"</span><span class="p">))</span> <span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">BiggestArea</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<p>For the second parameter, we must pass an <a class="reference external" href="../../hurricane/classHurricane_1_1Occurrence.html">Occurrence</a>. Occurrence objects will
|
|
be explained in detail later, for now, let say that we must construct the
|
|
Occurrence object with one parameter : the <a class="reference external" href="../../hurricane/classHurricane_1_1Plug.html">Plug</a> for which we want to create a
|
|
physical connection.</p>
|
|
<p>The <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a> <tt class="docutils literal">rp</tt> will be a component of the <tt class="docutils literal">a</tt> net.</p>
|
|
<p>The third argument ask the constructor of the <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a> to select in the
|
|
master net, the component which has the biggest area.</p>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p><strong>Component selection.</strong> Not all the components of a net can be
|
|
selected for connection through a <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPad</a>. The candidates must
|
|
have been flagged with the <a class="reference external" href="../../hurricane/classHurricane_1_1NetExternalComponents.html">NetExternalComponents</a> class.</p>
|
|
<p class="last">See <a class="reference external" href="./CellNetComponent.html#id1">3.6.3 Creating a Component</a>.</p>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="nets-regular-wiring">
|
|
<h4>6.4.4 Nets -- Regular wiring</h4>
|
|
<p>After the creation of the <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPads</a>, the wiring is to be created with
|
|
ordinary layout components (<a class="reference external" href="../../hurricane/classHurricane_1_1Horizontal.html">Horizontal</a>, <a class="reference external" href="../../hurricane/classHurricane_1_1Vertical.html">Vertical</a> and <a class="reference external" href="../../hurricane/classHurricane_1_1Contact.html">Contact</a> possibly
|
|
articulated). Here is the complete code for net <tt class="docutils literal">a</tt>. We made an articulated
|
|
layout where contacts are created over <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPads</a> then segments over
|
|
contacts.</p>
|
|
<div class="highlight"><pre><span></span><span class="c1"># Build wiring for a.</span>
|
|
<span class="c1"># Create RoutingPads first.</span>
|
|
<span class="n">rp1</span> <span class="o">=</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">a</span>
|
|
<span class="p">,</span> <span class="n">Occurrence</span><span class="p">(</span> <span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">"i0"</span><span class="p">))</span> <span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">BiggestArea</span> <span class="p">)</span>
|
|
<span class="n">rp2</span> <span class="o">=</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">a</span>
|
|
<span class="p">,</span> <span class="n">Occurrence</span><span class="p">(</span> <span class="n">a2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">"i0"</span><span class="p">))</span> <span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">BiggestArea</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Then regular wiring.</span>
|
|
<span class="n">contact1</span> <span class="o">=</span> <span class="n">Contact</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">rp1</span><span class="p">,</span> <span class="n">via12</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="o">-</span><span class="mf">15.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">contact2</span> <span class="o">=</span> <span class="n">Contact</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">rp2</span><span class="p">,</span> <span class="n">via12</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">10.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">turn</span> <span class="o">=</span> <span class="n">Contact</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">a</span> <span class="p">,</span> <span class="n">via23</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">35.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">contact2</span><span class="p">,</span> <span class="n">turn</span> <span class="p">,</span> <span class="n">metal2</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">35.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span> <span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">turn</span> <span class="p">,</span> <span class="n">contact1</span> <span class="p">,</span> <span class="n">metal3</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">In order to better see the layout of the wiring only, open the
|
|
<tt class="docutils literal">Controller</tt> and in the <span class="fboxtt">Filter</span> tab, uncheck
|
|
<span class="fboxtt">Process Terminal Cells</span>.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="id6">
|
|
<h3>6.5 The Complete Example File</h3>
|
|
<p>The example file <tt class="docutils literal">fulladder.py</tt> can be found in the <tt class="docutils literal">share/doc/coriolis2/examples/scripts/</tt>
|
|
directory (under the the root of the <span class="sc">Coriolis</span> installation).</p>
|
|
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">sys</span>
|
|
<span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="n">DataBase</span><span class="p">,</span> <span class="n">Instance</span><span class="p">,</span> <span class="n">Box</span><span class="p">,</span> <span class="n">Net</span><span class="p">,</span> <span class="n">Horizontal</span><span class="p">,</span> <span class="n">Vertical</span><span class="p">,</span> <span class="n">Contact</span><span class="p">,</span> \
|
|
<span class="n">RoutingPad</span><span class="p">,</span> <span class="n">Transformation</span><span class="p">,</span> <span class="n">Occurrence</span><span class="p">,</span> \
|
|
<span class="n">Breakpoint</span>
|
|
<span class="kn">from</span> <span class="nn">CRL</span> <span class="kn">import</span> <span class="n">AllianceFramework</span><span class="p">,</span> <span class="n">Catalog</span><span class="p">,</span> <span class="n">Gds</span>
|
|
<span class="kn">from</span> <span class="nn">helpers</span> <span class="kn">import</span> <span class="n">l</span>
|
|
<span class="kn">from</span> <span class="nn">helpers.overlay</span> <span class="kn">import</span> <span class="n">UpdateSession</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">doBreak</span> <span class="p">(</span> <span class="n">level</span><span class="p">,</span> <span class="n">message</span> <span class="p">):</span>
|
|
<span class="sd">"""Put a breakpoint into the script."""</span>
|
|
<span class="n">Breakpoint</span><span class="o">.</span><span class="n">stop</span><span class="p">(</span> <span class="n">level</span><span class="p">,</span> <span class="n">message</span> <span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">buildFulladder</span> <span class="p">(</span> <span class="n">editor</span> <span class="p">):</span>
|
|
<span class="sd">"""Build step by step full adder (netlist & placement)."""</span>
|
|
<span class="c1"># Get the Framework and all the master cells.</span>
|
|
<span class="n">af</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
|
<span class="n">xr2_x2</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'xr2_x1'</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
<span class="n">a2_x2</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'a2_x2'</span> <span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
<span class="n">o2_x2</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'o2_x2'</span> <span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">fulladder</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">'fulladder'</span> <span class="p">)</span>
|
|
<span class="n">fulladder</span><span class="o">.</span><span class="n">setAbutmentBox</span><span class="p">(</span> <span class="n">Box</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">90.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">100.0</span><span class="p">)</span> <span class="p">)</span> <span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">editor</span><span class="p">:</span>
|
|
<span class="n">editor</span><span class="o">.</span><span class="n">setCell</span><span class="p">(</span> <span class="n">fulladder</span> <span class="p">)</span>
|
|
<span class="n">editor</span><span class="o">.</span><span class="n">fit</span><span class="p">()</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="c1"># Create Instances.</span>
|
|
<span class="n">a2_1</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'a2_1'</span><span class="p">,</span> <span class="n">a2_x2</span> <span class="p">)</span>
|
|
<span class="n">a2_2</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'a2_2'</span><span class="p">,</span> <span class="n">a2_x2</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'xr2_1'</span><span class="p">,</span> <span class="n">xr2_x2</span> <span class="p">)</span>
|
|
<span class="n">xr2_2</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'xr2_2'</span><span class="p">,</span> <span class="n">xr2_x2</span> <span class="p">)</span>
|
|
<span class="n">o2_1</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'o2_1'</span><span class="p">,</span> <span class="n">o2_x2</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Create Nets.</span>
|
|
<span class="n">vss</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">"vss"</span> <span class="p">)</span>
|
|
<span class="n">vss</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">vss</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
|
|
<span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">"vdd"</span> <span class="p">)</span>
|
|
<span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
|
|
<span class="n">cin</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">"cin"</span> <span class="p">)</span>
|
|
<span class="n">cin</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span>
|
|
<span class="n">a2_2</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span>
|
|
|
|
<span class="n">a</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'a'</span> <span class="p">)</span>
|
|
<span class="n">a</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
|
|
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
|
|
|
|
<span class="n">b</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'b'</span> <span class="p">)</span>
|
|
<span class="n">b</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span>
|
|
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span>
|
|
|
|
<span class="n">sout_1</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'sout_1'</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span> <span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout_1</span> <span class="p">)</span>
|
|
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout_1</span> <span class="p">)</span>
|
|
<span class="n">a2_2</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout_1</span> <span class="p">)</span>
|
|
|
|
<span class="n">carry_1</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'carry_1'</span> <span class="p">)</span>
|
|
<span class="n">a2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span> <span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_1</span> <span class="p">)</span>
|
|
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_1</span> <span class="p">)</span>
|
|
|
|
<span class="n">carry_2</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'carry_2'</span> <span class="p">)</span>
|
|
<span class="n">a2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span> <span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_2</span> <span class="p">)</span>
|
|
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_2</span> <span class="p">)</span>
|
|
|
|
<span class="n">sout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'sout'</span> <span class="p">)</span>
|
|
<span class="n">sout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout</span> <span class="p">)</span>
|
|
|
|
<span class="n">cout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'cout'</span> <span class="p">)</span>
|
|
<span class="n">cout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cout</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Instances placement.</span>
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">a2_1</span><span class="o">.</span><span class="n">setTransformation</span><span class="p">(</span> <span class="n">Transformation</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">0.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">Transformation</span><span class="o">.</span><span class="n">Orientation</span><span class="o">.</span><span class="n">ID</span> <span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">a2_1</span><span class="o">.</span><span class="n">setPlacementStatus</span><span class="p">(</span> <span class="n">Instance</span><span class="o">.</span><span class="n">PlacementStatus</span><span class="o">.</span><span class="n">PLACED</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Placed a2_1'</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">setTransformation</span><span class="p">(</span> <span class="n">Transformation</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">100.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">Transformation</span><span class="o">.</span><span class="n">Orientation</span><span class="o">.</span><span class="n">MY</span> <span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">setPlacementStatus</span><span class="p">(</span> <span class="n">Instance</span><span class="o">.</span><span class="n">PlacementStatus</span><span class="o">.</span><span class="n">PLACED</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Placed xr2_1'</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">a2_2</span><span class="o">.</span><span class="n">setTransformation</span><span class="p">(</span> <span class="n">Transformation</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span><span class="mf">25.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">Transformation</span><span class="o">.</span><span class="n">Orientation</span><span class="o">.</span><span class="n">ID</span> <span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">a2_2</span><span class="o">.</span><span class="n">setPlacementStatus</span><span class="p">(</span> <span class="n">Instance</span><span class="o">.</span><span class="n">PlacementStatus</span><span class="o">.</span><span class="n">PLACED</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Placed a2_2'</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">xr2_2</span><span class="o">.</span><span class="n">setTransformation</span><span class="p">(</span> <span class="n">Transformation</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span> <span class="mf">45.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">100.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">Transformation</span><span class="o">.</span><span class="n">Orientation</span><span class="o">.</span><span class="n">MY</span> <span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">xr2_2</span><span class="o">.</span><span class="n">setPlacementStatus</span><span class="p">(</span> <span class="n">Instance</span><span class="o">.</span><span class="n">PlacementStatus</span><span class="o">.</span><span class="n">PLACED</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Placed xr2_2'</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">o2_1</span><span class="o">.</span><span class="n">setTransformation</span><span class="p">(</span> <span class="n">Transformation</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span><span class="mf">65.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">Transformation</span><span class="o">.</span><span class="n">Orientation</span><span class="o">.</span><span class="n">ID</span> <span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">o2_1</span><span class="o">.</span><span class="n">setPlacementStatus</span><span class="p">(</span> <span class="n">Instance</span><span class="o">.</span><span class="n">PlacementStatus</span><span class="o">.</span><span class="n">PLACED</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Placed o2_1'</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Add filler cells.</span>
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">tie_x0</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'tie_x0'</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
<span class="n">rowend_x0</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'rowend_x0'</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
<span class="n">filler_1</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'filler_1'</span><span class="p">,</span> <span class="n">tie_x0</span> <span class="p">)</span>
|
|
<span class="n">filler_2</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'filler_2'</span><span class="p">,</span> <span class="n">rowend_x0</span> <span class="p">)</span>
|
|
|
|
<span class="n">filler_1</span><span class="o">.</span><span class="n">setTransformation</span><span class="p">(</span> <span class="n">Transformation</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span><span class="mf">50.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">Transformation</span><span class="o">.</span><span class="n">Orientation</span><span class="o">.</span><span class="n">ID</span> <span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">filler_1</span><span class="o">.</span><span class="n">setPlacementStatus</span><span class="p">(</span> <span class="n">Instance</span><span class="o">.</span><span class="n">PlacementStatus</span><span class="o">.</span><span class="n">PLACED</span> <span class="p">)</span>
|
|
|
|
<span class="n">filler_2</span><span class="o">.</span><span class="n">setTransformation</span><span class="p">(</span> <span class="n">Transformation</span><span class="p">(</span> <span class="n">l</span><span class="p">(</span><span class="mf">60.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">Transformation</span><span class="o">.</span><span class="n">Orientation</span><span class="o">.</span><span class="n">ID</span> <span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">filler_2</span><span class="o">.</span><span class="n">setPlacementStatus</span><span class="p">(</span> <span class="n">Instance</span><span class="o">.</span><span class="n">PlacementStatus</span><span class="o">.</span><span class="n">PLACED</span> <span class="p">)</span>
|
|
<span class="n">doBreak</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'Filler cell placeds'</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Getting the layers.</span>
|
|
<span class="n">technology</span> <span class="o">=</span> <span class="n">DataBase</span><span class="o">.</span><span class="n">getDB</span><span class="p">()</span><span class="o">.</span><span class="n">getTechnology</span><span class="p">()</span>
|
|
<span class="n">metal2</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"METAL2"</span> <span class="p">)</span>
|
|
<span class="n">metal3</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"METAL3"</span> <span class="p">)</span>
|
|
<span class="n">via12</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"VIA12"</span> <span class="p">)</span>
|
|
<span class="n">via23</span> <span class="o">=</span> <span class="n">technology</span><span class="o">.</span><span class="n">getLayer</span><span class="p">(</span> <span class="s2">"VIA23"</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="c1"># Build wiring for a.</span>
|
|
<span class="c1"># Create RoutingPads first.</span>
|
|
<span class="n">rp1</span> <span class="o">=</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">a</span>
|
|
<span class="p">,</span> <span class="n">Occurrence</span><span class="p">(</span> <span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">"i0"</span><span class="p">))</span> <span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">BiggestArea</span> <span class="p">)</span>
|
|
<span class="n">rp2</span> <span class="o">=</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">a</span>
|
|
<span class="p">,</span> <span class="n">Occurrence</span><span class="p">(</span> <span class="n">a2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s2">"i0"</span><span class="p">))</span> <span class="p">)</span>
|
|
<span class="p">,</span> <span class="n">RoutingPad</span><span class="o">.</span><span class="n">BiggestArea</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Then regular wiring.</span>
|
|
<span class="n">contact1</span> <span class="o">=</span> <span class="n">Contact</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">rp1</span><span class="p">,</span> <span class="n">via12</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="o">-</span><span class="mf">15.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">contact2</span> <span class="o">=</span> <span class="n">Contact</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">rp2</span><span class="p">,</span> <span class="n">via12</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span> <span class="mf">0.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">10.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">turn</span> <span class="o">=</span> <span class="n">Contact</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">a</span> <span class="p">,</span> <span class="n">via23</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span> <span class="mf">35.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Horizontal</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">contact2</span><span class="p">,</span> <span class="n">turn</span> <span class="p">,</span> <span class="n">metal2</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">35.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span>
|
|
<span class="n">Vertical</span> <span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">turn</span> <span class="p">,</span> <span class="n">contact1</span> <span class="p">,</span> <span class="n">metal3</span><span class="p">,</span> <span class="n">l</span><span class="p">(</span><span class="mf">10.0</span><span class="p">),</span> <span class="n">l</span><span class="p">(</span><span class="mf">2.0</span><span class="p">)</span> <span class="p">)</span>
|
|
|
|
<span class="n">af</span><span class="o">.</span><span class="n">saveCell</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span>
|
|
<span class="sd">"""The Mandatory function to be run by Coriolis interactively."""</span>
|
|
<span class="n">editor</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="s1">'editor'</span> <span class="ow">in</span> <span class="n">kw</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'editor'</span><span class="p">]:</span>
|
|
<span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'editor'</span><span class="p">]</span>
|
|
<span class="n">buildFulladder</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
</pre></div>
|
|
<!-- -*- Mode: rst -*- -->
|
|
</div>
|
|
</div>
|
|
<div class="section" id="working-in-real-mode">
|
|
<h2><a class="toc-backref" href="#id16">7. Working in real mode</a></h2>
|
|
<p>The <a class="reference external" href="../../crlcore/classCRL_1_1AllianceFramework.html">AllianceFramework</a> only manages <em>symbolic</em> layout as <span class="sc">Alliance</span> does.
|
|
But <span class="sc">Coriolis</span> is also able to work directly in <em>real</em> mode, meaning
|
|
that distances will be expressed in microns instead of lambdas.</p>
|
|
<p>The <em>real</em> mode will be illustrated by working with the <a class="reference external" href="https://www.eda.ncsu.edu/wiki/FreePDK45:Contents">FreePDK45</a>.</p>
|
|
<p>We will assume that the <a class="reference external" href="https://www.eda.ncsu.edu/wiki/FreePDK45:Contents">FreePDK45</a> archives is installed under:</p>
|
|
<pre class="literal-block">
|
|
/home/dks/
|
|
</pre>
|
|
<div class="section" id="loading-a-lef-file">
|
|
<h3>7.1 Loading a <span class="sc">lef</span> file</h3>
|
|
<p>Importing a <span class="sc">lef</span> file is simple, you just call the static function
|
|
<tt class="docutils literal">LefImport.load()</tt>. Multiple <span class="sc">lef</span> file can be imported one after
|
|
another.</p>
|
|
<div class="highlight"><pre><span></span><span class="c1"># You must set "DKsdir" to where you did install the NCSU FreePDK 45nm DK.</span>
|
|
<span class="n">DKsdir</span> <span class="o">=</span> <span class="s1">'/home/dks'</span>
|
|
|
|
<span class="n">library</span> <span class="o">=</span> <span class="n">LefImport</span><span class="o">.</span><span class="n">load</span><span class="p">(</span> <span class="n">DKsdir</span> <span class="o">+</span> <span class="s1">'/FreePDK45/osu_soc/lib/files/gscl45nm.lef'</span> <span class="p">)</span>
|
|
</pre></div>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last"><strong>Technology checking.</strong> The first imported <span class="sc">lef</span> file must contain the
|
|
technology. The technology described in the <span class="sc">lef</span> file will be checked
|
|
against the one configured in the running instance of <span class="sc">Coriolis</span> to look
|
|
for any discrepencies.</p>
|
|
</div>
|
|
</div>
|
|
<div class="section" id="loading-a-blif-file-yosys">
|
|
<h3>7.2 Loading a <span class="sc">blif</span> file -- <span class="sc">Yosys</span></h3>
|
|
<p>The <span class="sc">blif</span> format is generated by the <a class="reference external" href="http://www.clifford.at/yosys/">Yosys</a> logic synthetizer. Here again, it is
|
|
pretty straightforward: call the static function <tt class="docutils literal">Blif.load()</tt>. If you made
|
|
your synthesis on a cell library not managed by <a class="reference external" href="../../crlcore/classCRL_1_1AllianceFramework.html">AllianceFramework</a>, for example
|
|
the one of the FreePDK45, you must load it prior to calling the <span class="sc">blif</span> loader.</p>
|
|
<div class="highlight"><pre><span></span><span class="n">cell</span> <span class="o">=</span> <span class="n">Blif</span><span class="o">.</span><span class="n">load</span><span class="p">(</span> <span class="s1">'snx'</span> <span class="p">)</span> <span class="c1"># load "snx.blif" in the working directory.</span>
|
|
</pre></div>
|
|
<!-- -*- Mode: rst -*- -->
|
|
</div>
|
|
</div>
|
|
<div class="section" id="tool-engines-crl-core">
|
|
<h2><a class="toc-backref" href="#id17">8. Tool Engines (CRL Core)</a></h2>
|
|
<p>The <a class="reference external" href="../../crlcore/classCRL_1_1ToolEngine.html">ToolEngine</a> class is the base class for all tools developped in
|
|
<span class="sc">Coriolis</span>. In the rest of the tutorial we will use the names <tt class="docutils literal">tool</tt>
|
|
or <tt class="docutils literal">engine</tt> as synonyms.</p>
|
|
<div class="section" id="placer-etesian">
|
|
<h3>8.1 Placer -- Etesian</h3>
|
|
<p>To run the placer, create the <span class="sc">Etesian</span> engine, then call the <tt class="docutils literal">place()</tt>
|
|
function.</p>
|
|
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">Etesian</span>
|
|
|
|
<span class="c1"># [...]</span>
|
|
|
|
<span class="n">etesian</span> <span class="o">=</span> <span class="n">Etesian</span><span class="o">.</span><span class="n">EtesianEngine</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">cell</span><span class="p">)</span>
|
|
<span class="n">etesian</span><span class="o">.</span><span class="n">place</span><span class="p">()</span>
|
|
</pre></div>
|
|
<p>You can configure the placer in two ways:</p>
|
|
<ol class="arabic">
|
|
<li><p class="first">Prior to the creation of the engine, setup an abutment for the cell.
|
|
The placer will fit the cells into that area. If the area is too
|
|
small, it will issue an error.</p>
|
|
</li>
|
|
<li><p class="first">Setup <span class="sc">Etesian</span> parameters through the <tt class="docutils literal">settings.py</tt> configuration
|
|
file. For example:</p>
|
|
<div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">overlay</span><span class="o">.</span><span class="n">CfgCache</span><span class="p">(</span><span class="n">priority</span><span class="o">=</span><span class="n">Cfg</span><span class="o">.</span><span class="n">Parameter</span><span class="o">.</span><span class="n">Priority</span><span class="o">.</span><span class="n">UserFile</span><span class="p">)</span> <span class="k">as</span> <span class="n">cfg</span><span class="p">:</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">etesian</span><span class="o">.</span><span class="n">effort</span> <span class="o">=</span> <span class="mi">2</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">etesian</span><span class="o">.</span><span class="n">uniformDensity</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">etesian</span><span class="o">.</span><span class="n">spaceMargin</span> <span class="o">=</span> <span class="mf">0.8</span>
|
|
<span class="n">cfg</span><span class="o">.</span><span class="n">etesian</span><span class="o">.</span><span class="n">aspectRatio</span> <span class="o">=</span> <span class="mf">1.0</span>
|
|
</pre></div>
|
|
<p>With this setup, the cells will be spread uniformally over the
|
|
area (<tt class="docutils literal">etesian.uniformDensity</tt>), with <tt class="docutils literal">80%</tt> of free space
|
|
added and an aspect ratio of <tt class="docutils literal">100%</tt> (square shape).</p>
|
|
</li>
|
|
</ol>
|
|
</div>
|
|
<div class="section" id="router-katana">
|
|
<h3>8.1 Router -- Katana</h3>
|
|
<p>Like for <span class="sc">Etesian</span>, you have to create the engine on the cell then call
|
|
the sequence of functions detailed below.</p>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last"><strong>Kite vs. Katana.</strong> There are currently two routers in <span class="sc">Coriolis</span>,
|
|
<span class="sc">Kite</span> is the old one and digital only. <span class="sc">Katana</span> is a re-implementation
|
|
with support for mixed routing (digital <strong>and</strong> analog).
|
|
Until <span class="sc">Katana</span> is fully implemented we keep both of them.</p>
|
|
</div>
|
|
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">Anabatic</span>
|
|
<span class="kn">import</span> <span class="nn">Katana</span>
|
|
|
|
<span class="c1"># [...]</span>
|
|
|
|
<span class="n">katana</span> <span class="o">=</span> <span class="n">Katana</span><span class="o">.</span><span class="n">KatanaEngine</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">cell</span><span class="p">)</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">digitalInit</span> <span class="p">()</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">runGlobalRouter</span> <span class="p">()</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">loadGlobalRouting</span><span class="p">(</span> <span class="n">Anabatic</span><span class="o">.</span><span class="n">EngineLoadGrByNet</span> <span class="p">)</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">layerAssign</span> <span class="p">(</span> <span class="n">Anabatic</span><span class="o">.</span><span class="n">EngineNoNetLayerAssign</span> <span class="p">)</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">runNegociate</span> <span class="p">(</span> <span class="n">Katana</span><span class="o">.</span><span class="n">Flags</span><span class="o">.</span><span class="n">NoFlags</span> <span class="p">)</span>
|
|
</pre></div>
|
|
</div>
|
|
<div class="section" id="a-complete-example">
|
|
<h3>8.2 A Complete Example</h3>
|
|
<p>The example file <tt class="docutils literal">toolengines.py</tt> can be found in the <tt class="docutils literal">share/doc/coriolis2/examples/scripts/</tt>
|
|
directory (under the the root of the <span class="sc">Coriolis</span> installation).</p>
|
|
<p>This script automatically places and routes the <tt class="docutils literal">fulladder</tt> netlist as seen
|
|
previously. The call to the <a class="reference external" href="../../crlcore/classCRL_1_1ToolEngine.html">ToolEngines</a> is made inside the new function
|
|
<tt class="docutils literal">placeAndRoute()</tt>.</p>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">As the <tt class="docutils literal">ToolEngine</tt> take care of opening and closing <a class="reference external" href="../../hurricane/classHurricane_1_1UpdateSession.html">UpdateSession</a>, we
|
|
do not need the wrapper function <tt class="docutils literal">doBreak()</tt> around the breakpoints.
|
|
We directly call <a class="reference external" href="../../hurricane/classHurricane_1_1Breakpoint.html">Breakpoint</a>.</p>
|
|
</div>
|
|
<div class="admonition note">
|
|
<p class="first admonition-title">Note</p>
|
|
<p class="last">The space margin for this example is very high (<tt class="docutils literal">80%</tt>), it's only
|
|
because it's too small for the placer to run correctly. For normal
|
|
case it is around <tt class="docutils literal">3%</tt>.</p>
|
|
</div>
|
|
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">sys</span>
|
|
<span class="kn">from</span> <span class="nn">Hurricane</span> <span class="kn">import</span> <span class="o">*</span>
|
|
<span class="kn">from</span> <span class="nn">CRL</span> <span class="kn">import</span> <span class="o">*</span>
|
|
<span class="kn">import</span> <span class="nn">Etesian</span>
|
|
<span class="kn">import</span> <span class="nn">Anabatic</span>
|
|
<span class="kn">import</span> <span class="nn">Katana</span>
|
|
|
|
<span class="c1"># Everybody needs it.</span>
|
|
<span class="n">af</span> <span class="o">=</span> <span class="n">AllianceFramework</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span> <span class="nf">buildFulladder</span> <span class="p">(</span> <span class="n">editor</span> <span class="p">):</span>
|
|
<span class="c1"># Get the Framework and all the master cells.</span>
|
|
<span class="n">xr2_x2</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'xr2_x1'</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
<span class="n">a2_x2</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'a2_x2'</span> <span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
<span class="n">o2_x2</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">getCell</span><span class="p">(</span> <span class="s1">'o2_x2'</span> <span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
|
|
<span class="k">with</span> <span class="n">UpdateSession</span><span class="p">():</span>
|
|
<span class="n">fulladder</span> <span class="o">=</span> <span class="n">af</span><span class="o">.</span><span class="n">createCell</span><span class="p">(</span> <span class="s1">'fulladder'</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Create Instances.</span>
|
|
<span class="n">a2_1</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'a2_1'</span><span class="p">,</span> <span class="n">a2_x2</span> <span class="p">)</span>
|
|
<span class="n">a2_2</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'a2_2'</span><span class="p">,</span> <span class="n">a2_x2</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'xr2_1'</span><span class="p">,</span> <span class="n">xr2_x2</span> <span class="p">)</span>
|
|
<span class="n">xr2_2</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'xr2_2'</span><span class="p">,</span> <span class="n">xr2_x2</span> <span class="p">)</span>
|
|
<span class="n">o2_1</span> <span class="o">=</span> <span class="n">Instance</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'o2_1'</span><span class="p">,</span> <span class="n">o2_x2</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Create Nets.</span>
|
|
<span class="n">vss</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">"vss"</span> <span class="p">)</span>
|
|
<span class="n">vss</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">vss</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
|
|
<span class="n">vdd</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">"vdd"</span> <span class="p">)</span>
|
|
<span class="n">vdd</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">vdd</span><span class="o">.</span><span class="n">setGlobal</span> <span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
|
|
<span class="n">cin</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s2">"cin"</span> <span class="p">)</span>
|
|
<span class="n">cin</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span>
|
|
<span class="n">a2_2</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cin</span> <span class="p">)</span>
|
|
|
|
<span class="n">a</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'a'</span> <span class="p">)</span>
|
|
<span class="n">a</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
|
|
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">a</span> <span class="p">)</span>
|
|
|
|
<span class="n">b</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'b'</span> <span class="p">)</span>
|
|
<span class="n">b</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span>
|
|
<span class="n">a2_1</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">b</span> <span class="p">)</span>
|
|
|
|
<span class="n">sout_1</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'sout_1'</span> <span class="p">)</span>
|
|
<span class="n">xr2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span> <span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout_1</span> <span class="p">)</span>
|
|
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout_1</span> <span class="p">)</span>
|
|
<span class="n">a2_2</span> <span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout_1</span> <span class="p">)</span>
|
|
|
|
<span class="n">carry_1</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'carry_1'</span> <span class="p">)</span>
|
|
<span class="n">a2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span> <span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_1</span> <span class="p">)</span>
|
|
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i1'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_1</span> <span class="p">)</span>
|
|
|
|
<span class="n">carry_2</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'carry_2'</span> <span class="p">)</span>
|
|
<span class="n">a2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">a2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span> <span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_2</span> <span class="p">)</span>
|
|
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'i0'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">carry_2</span> <span class="p">)</span>
|
|
|
|
<span class="n">sout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'sout'</span> <span class="p">)</span>
|
|
<span class="n">sout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">xr2_2</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">xr2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">sout</span> <span class="p">)</span>
|
|
|
|
<span class="n">cout</span> <span class="o">=</span> <span class="n">Net</span><span class="o">.</span><span class="n">create</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="s1">'cout'</span> <span class="p">)</span>
|
|
<span class="n">cout</span><span class="o">.</span><span class="n">setExternal</span><span class="p">(</span> <span class="kc">True</span> <span class="p">)</span>
|
|
<span class="n">o2_1</span><span class="o">.</span><span class="n">getPlug</span><span class="p">(</span> <span class="n">o2_x2</span><span class="o">.</span><span class="n">getNet</span><span class="p">(</span><span class="s1">'q'</span><span class="p">)</span> <span class="p">)</span><span class="o">.</span><span class="n">setNet</span><span class="p">(</span> <span class="n">cout</span> <span class="p">)</span>
|
|
|
|
<span class="n">af</span><span class="o">.</span><span class="n">saveCell</span><span class="p">(</span> <span class="n">fulladder</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">fulladder</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">placeAndRoute</span> <span class="p">(</span> <span class="n">editor</span><span class="p">,</span> <span class="n">cell</span> <span class="p">):</span>
|
|
<span class="c1"># Run the placer.</span>
|
|
<span class="n">etesian</span> <span class="o">=</span> <span class="n">Etesian</span><span class="o">.</span><span class="n">EtesianEngine</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">cell</span><span class="p">)</span>
|
|
<span class="n">etesian</span><span class="o">.</span><span class="n">place</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="n">editor</span><span class="p">:</span>
|
|
<span class="n">editor</span><span class="o">.</span><span class="n">setCell</span><span class="p">(</span> <span class="n">cell</span> <span class="p">)</span>
|
|
<span class="n">editor</span><span class="o">.</span><span class="n">fit</span><span class="p">()</span>
|
|
|
|
<span class="n">Breakpoint</span><span class="o">.</span><span class="n">stop</span><span class="p">(</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'After placement'</span> <span class="p">)</span>
|
|
|
|
<span class="c1"># Run the router.</span>
|
|
<span class="n">katana</span> <span class="o">=</span> <span class="n">Katana</span><span class="o">.</span><span class="n">KatanaEngine</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">cell</span><span class="p">)</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">digitalInit</span> <span class="p">()</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">runGlobalRouter</span> <span class="p">()</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">loadGlobalRouting</span><span class="p">(</span> <span class="n">Anabatic</span><span class="o">.</span><span class="n">EngineLoadGrByNet</span> <span class="p">)</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">layerAssign</span> <span class="p">(</span> <span class="n">Anabatic</span><span class="o">.</span><span class="n">EngineNoNetLayerAssign</span> <span class="p">)</span>
|
|
<span class="n">katana</span><span class="o">.</span><span class="n">runNegociate</span> <span class="p">(</span> <span class="n">Katana</span><span class="o">.</span><span class="n">Flags</span><span class="o">.</span><span class="n">NoFlags</span> <span class="p">)</span>
|
|
|
|
<span class="n">af</span><span class="o">.</span><span class="n">saveCell</span><span class="p">(</span> <span class="n">cell</span><span class="p">,</span> <span class="n">Catalog</span><span class="o">.</span><span class="n">State</span><span class="o">.</span><span class="n">Views</span> <span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">scriptMain</span> <span class="p">(</span> <span class="o">**</span><span class="n">kw</span> <span class="p">):</span>
|
|
<span class="n">editor</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="s1">'editor'</span> <span class="ow">in</span> <span class="n">kw</span> <span class="ow">and</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'editor'</span><span class="p">]:</span>
|
|
<span class="n">editor</span> <span class="o">=</span> <span class="n">kw</span><span class="p">[</span><span class="s1">'editor'</span><span class="p">]</span>
|
|
<span class="n">fulladder</span> <span class="o">=</span> <span class="n">buildFulladder</span><span class="p">(</span> <span class="n">editor</span> <span class="p">)</span>
|
|
<span class="n">placeAndRoute</span><span class="p">(</span> <span class="n">editor</span><span class="p">,</span> <span class="n">fulladder</span> <span class="p">)</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
</pre></div>
|
|
<!-- -*- Mode: rst -*- -->
|
|
</div>
|
|
</div>
|
|
<div class="section" id="advanced-topics">
|
|
<h2><a class="toc-backref" href="#id18">9. Advanced Topics</a></h2>
|
|
<p>This is a place holder as well as a reminder to myself to write this part of
|
|
the documentation.</p>
|
|
<div class="section" id="id7">
|
|
<h3>9.1 Occurrence</h3>
|
|
<p>The trans-hierarchical workhorse.</p>
|
|
</div>
|
|
<div class="section" id="id8">
|
|
<h3>9.2 RoutingPads</h3>
|
|
<p>Unlike the <a class="reference external" href="../../hurricane/classHurricane_1_1Plug.html">Plugs</a> that only make connections between two <strong>adjacent</strong>
|
|
hierarchical levels, <a class="reference external" href="../../hurricane/classHurricane_1_1RoutingPad.html">RoutingPads</a> can refer to a deeply buried terminal.</p>
|
|
</div>
|
|
<div class="section" id="hypernets">
|
|
<h3>9.3 HyperNets</h3>
|
|
<p>This class is part of the <em>virtual flattening</em> mechanism, it allows to
|
|
go through all the components of a trans-hierarchical net.</p>
|
|
</div>
|
|
<div class="section" id="miscellaeous-trans-hierarchical-functions">
|
|
<h3>9.4 Miscellaeous trans-hierarchical functions</h3>
|
|
<p>For a starter, how to get all the leaf cells...</p>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
<!-- /Content -->
|
|
|
|
<!-- Footer -->
|
|
<div class="footer gradient-2">
|
|
<div class="container footer-container ">
|
|
<div class="row">
|
|
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-3">
|
|
<div class="footer-title">Social</div>
|
|
<ul class="list-unstyled">
|
|
</ul>
|
|
</div>
|
|
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-2">
|
|
</div>
|
|
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-3">
|
|
<div class="footer-title">Links</div>
|
|
<ul class="list-unstyled">
|
|
<li><a href="https://coriolis.lip6.fr/" target="_blank">Alliance/Coriolis</a></li>
|
|
<li><a href="https://www-soc.lip6.fr/" target="_blank">CIAN Team Website</a></li>
|
|
<li><a href="https://f-si.org" target="_blank">Free Silicon Foundation</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="col-xs-12 col-sm-3 col-md-3 col-lg-4">
|
|
<p class="pull-right text-right">
|
|
<small><em>Proudly powered by <a href="http://docs.getpelican.com/" target="_blank">pelican</a></em></small><br/>
|
|
<small><em><span class="sc">NEST</span> theme by <a href="https://github.com/molivier" target="_blank">molivier</a></em></small><br/>
|
|
<small>Copyright © 2020-2020 Sorbonne Universite</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- /Footer -->
|
|
</body>
|
|
</html> |