|
4 | 4 | <meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
5 | 5 |
|
6 | 6 | <meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
7 |
| - <title>Language guide — Amaranth language & toolchain 0.6.0.dev56 documentation</title> |
| 7 | + <title>Language guide — Amaranth language & toolchain 0.6.0.dev57 documentation</title> |
8 | 8 | <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=80d5e7a1" />
|
9 | 9 | <link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
|
10 | 10 | <link rel="stylesheet" type="text/css" href="_static/platformpicker.css" />
|
|
17 | 17 |
|
18 | 18 | <script src="_static/jquery.js?v=5d32c60e"></script>
|
19 | 19 | <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
20 |
| - <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=6de5cc12"></script> |
| 20 | + <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js?v=c99d480b"></script> |
21 | 21 | <script src="_static/doctools.js?v=888ff710"></script>
|
22 | 22 | <script src="_static/sphinx_highlight.js?v=4825356b"></script>
|
23 | 23 | <script src="_static/platformpicker.js"></script>
|
|
41 | 41 | <img src="_static/logo.png" class="logo" alt="Logo"/>
|
42 | 42 | </a>
|
43 | 43 | <div class="version">
|
44 |
| - 0.6.0.dev56 |
| 44 | + 0.6.0.dev57 |
45 | 45 | </div>
|
46 | 46 | <div role="search">
|
47 | 47 | <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
|
@@ -985,25 +985,21 @@ <h3>Signal shapes<a class="headerlink" href="#signal-shapes" title="Permalink to
|
985 | 985 | <span class="n">add_toggle</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
|
986 | 986 | </pre></div>
|
987 | 987 | </div>
|
988 |
| -<p id="lang-signalgranularity">Every signal included in the target of an assignment becomes a part of the domain, or equivalently, <em>driven</em> by that domain. A signal can be either undriven or driven by exactly one domain; it is an error to add two assignments to the same signal to two different domains:</p> |
| 988 | +<p id="lang-signalgranularity">Every signal bit included in the target of an assignment becomes a part of the domain, or equivalently, <em>driven</em> by that domain. A signal bit can be either undriven or driven by exactly one domain; it is an error to add two assignments to the same signal bit to two different domains:</p> |
989 | 989 | <div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">d</span> <span class="o">=</span> <span class="n">Signal</span><span class="p">()</span>
|
990 | 990 | <span class="gp">>>> </span><span class="n">m</span><span class="o">.</span><span class="n">d</span><span class="o">.</span><span class="n">comb</span> <span class="o">+=</span> <span class="n">d</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
991 | 991 | <span class="gp">>>> </span><span class="n">m</span><span class="o">.</span><span class="n">d</span><span class="o">.</span><span class="n">sync</span> <span class="o">+=</span> <span class="n">d</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
992 | 992 | <span class="gt">Traceback (most recent call last):</span>
|
993 | 993 | <span class="w"> </span><span class="c">...</span>
|
994 |
| -<span class="gr">amaranth.hdl.dsl.SyntaxError</span>: <span class="n">Driver-driver conflict: trying to drive (sig d) from d.sync, but it is already driven from d.comb</span> |
| 994 | +<span class="gr">amaranth.hdl.dsl.SyntaxError</span>: <span class="n">Driver-driver conflict: trying to drive (sig d) bit 0 from d.sync, but it is already driven from d.comb</span> |
995 | 995 | </pre></div>
|
996 | 996 | </div>
|
997 |
| -<div class="admonition note"> |
998 |
| -<p class="admonition-title">Note</p> |
999 |
| -<p>Clearly, Amaranth code that drives a single bit of a signal from two different domains does not describe a meaningful circuit. However, driving two different bits of a signal from two different domains does not inherently cause such a conflict. Would Amaranth accept the following code?</p> |
1000 |
| -<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">Signal</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> |
1001 |
| -<span class="n">m</span><span class="o">.</span><span class="n">d</span><span class="o">.</span><span class="n">comb</span> <span class="o">+=</span> <span class="n">e</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> |
1002 |
| -<span class="n">m</span><span class="o">.</span><span class="n">d</span><span class="o">.</span><span class="n">sync</span> <span class="o">+=</span> <span class="n">e</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> |
| 997 | +<p>However, two different bits of a signal can be driven from two different domains without an issue:</p> |
| 998 | +<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="o">=</span> <span class="n">Signal</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span> |
| 999 | +<span class="n">m</span><span class="o">.</span><span class="n">d</span><span class="o">.</span><span class="n">comb</span> <span class="o">+=</span> <span class="n">e</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> |
| 1000 | +<span class="n">m</span><span class="o">.</span><span class="n">d</span><span class="o">.</span><span class="n">sync</span> <span class="o">+=</span> <span class="n">e</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">eq</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> |
1003 | 1001 | </pre></div>
|
1004 | 1002 | </div>
|
1005 |
| -<p>The answer is no. While this kind of code is occasionally useful, rejecting it greatly simplifies backends, simulators, and analyzers.</p> |
1006 |
| -</div> |
1007 | 1003 | <p>In addition to assignments, <a class="reference internal" href="#lang-assert"><span class="std std-ref">assertions</span></a> and <a class="reference internal" href="#lang-print"><span class="std std-ref">debug prints</span></a> can be added using the same syntax.</p>
|
1008 | 1004 | </section>
|
1009 | 1005 | <section id="assignment-order">
|
|
0 commit comments