<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel VH</title>
    <description>The latest articles on DEV Community by Daniel VH (@daniel_vh).</description>
    <link>https://dev.to/daniel_vh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3526063%2Fe9ae5de6-7e1c-4a86-83f3-013ce08fd735.png</url>
      <title>DEV Community: Daniel VH</title>
      <link>https://dev.to/daniel_vh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daniel_vh"/>
    <language>en</language>
    <item>
      <title>D-FlipFlip circuit model with signals and Dart</title>
      <dc:creator>Daniel VH</dc:creator>
      <pubDate>Wed, 24 Sep 2025 10:07:01 +0000</pubDate>
      <link>https://dev.to/daniel_vh/d-flipflip-circuit-model-with-signals-and-dart-53eo</link>
      <guid>https://dev.to/daniel_vh/d-flipflip-circuit-model-with-signals-and-dart-53eo</guid>
      <description>&lt;p&gt;One of my hobbies is to "re-invent" already done things, such as building a CPU simulator, create my own ISA and what-not.&lt;/p&gt;

&lt;p&gt;While happily coding away on an instruction decoder with some simulated EEPROM chips, it hit me: why don't I use signals to simulate wiring between the components? I used them in Flutter and I need the same kind of reactivity here too. Guess what? Signals were originally intended for that. WHO KNEW?! :D&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;trivia&lt;/strong&gt;: signals got their name after digital circuit modeling research in the 1970s&lt;sup&gt;1&lt;/sup&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is a D-FlipFlop
&lt;/h2&gt;

&lt;p&gt;In a super-simple form, a D-FlipFlop samples an input pin when another signal (clock transitions from lo to hi&lt;sup&gt;2&lt;/sup&gt;. When transition happens, the state of the input pin (hi or lo) is latched in and is output to &lt;code&gt;q&lt;/code&gt;. The inverse of that latched in value is output to &lt;code&gt;q̅&lt;/code&gt; (q-bar).&lt;/p&gt;

&lt;h2&gt;
  
  
  Simulation in Dart
&lt;/h2&gt;

&lt;p&gt;A couple of hours of playing around and I ended up with the following piece of code to simulate a D-FlipFlop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DFlipFlop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;clock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Input is a signal&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;late&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;_prevQ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;late&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;clk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// detect rising edge, sample input pin&lt;/span&gt;
      &lt;span class="n"&gt;_prevQ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_prevQ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;late&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;qBar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;Essentially it boils down to the following core concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;input&lt;/strong&gt; pins are &lt;u&gt;signals&lt;/u&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;output&lt;/strong&gt; pins are derived values (&lt;u&gt;computed&lt;/u&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;connections/wires&lt;/strong&gt; between input and output pins are &lt;u&gt;effects&lt;/u&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the full code sample, check out this &lt;a href="https://gist.github.com/daniel-v/95c2b17fac7fd58b7cc1509bf1603995" rel="noopener noreferrer"&gt;gist&lt;/a&gt;:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;






&lt;h4&gt;
  
  
  Footnotes
&lt;/h4&gt;

&lt;p&gt;&lt;small&gt;1. &lt;a href="https://youtu.be/Jp7QBjY5K34?t=171" rel="noopener noreferrer"&gt;https://youtu.be/Jp7QBjY5K34?t=171&lt;/a&gt;&lt;/small&gt;&lt;br&gt;
&lt;small&gt;2. &lt;code&gt;lo&lt;/code&gt; and &lt;code&gt;hi&lt;/code&gt; values are often "mistyped" to indicate logical high and low voltage levels&lt;/small&gt;&lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>software</category>
    </item>
  </channel>
</rss>
