Skip to content

Instantly share code, notes, and snippets.

@voidbert
Last active March 7, 2023 23:27
Show Gist options
  • Save voidbert/f515bca59a5ecbcb18eded8cd12062e5 to your computer and use it in GitHub Desktop.
Save voidbert/f515bca59a5ecbcb18eded8cd12062e5 to your computer and use it in GitHub Desktop.
Hardware implementation of a Collatz Conjecture convergence checker (logisim-evolution)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project source="3.8.0" version="1.0">
This file is intended to be loaded by Logisim-evolution v3.8.0(https://github.com/logisim-evolution/).
<lib desc="#Wiring" name="0">
<tool name="Splitter">
<a name="appear" val="right"/>
<a name="facing" val="north"/>
</tool>
<tool name="Pin">
<a name="appearance" val="classic"/>
</tool>
<tool name="Clock">
<a name="facing" val="north"/>
</tool>
</lib>
<lib desc="#Gates" name="1">
<tool name="AND Gate">
<a name="size" val="30"/>
</tool>
<tool name="OR Gate">
<a name="facing" val="north"/>
</tool>
</lib>
<lib desc="#Plexers" name="2"/>
<lib desc="#Arithmetic" name="3"/>
<lib desc="#Memory" name="4"/>
<lib desc="#I/O" name="5"/>
<lib desc="#Base" name="6"/>
<main name="main"/>
<options>
<a name="gateUndefined" val="ignore"/>
<a name="simlimit" val="1000"/>
<a name="simrand" val="0"/>
</options>
<mappings>
<tool lib="6" map="Button2" name="Poke Tool"/>
<tool lib="6" map="Button3" name="Menu Tool"/>
<tool lib="6" map="Ctrl Button1" name="Menu Tool"/>
</mappings>
<toolbar>
<tool lib="6" name="Poke Tool"/>
<tool lib="6" name="Edit Tool"/>
<tool lib="6" name="Wiring Tool"/>
<tool lib="6" name="Text Tool"/>
<sep/>
<tool lib="0" name="Pin"/>
<tool lib="0" name="Pin">
<a name="facing" val="west"/>
<a name="output" val="true"/>
</tool>
<sep/>
<tool lib="1" name="NOT Gate"/>
<tool lib="1" name="AND Gate"/>
<tool lib="1" name="OR Gate"/>
<tool lib="1" name="XOR Gate"/>
<tool lib="1" name="NAND Gate"/>
<tool lib="1" name="NOR Gate"/>
<sep/>
<tool lib="4" name="D Flip-Flop"/>
<tool lib="4" name="Register"/>
</toolbar>
<circuit name="main">
<a name="appearance" val="logisim_evolution"/>
<a name="circuit" val="main"/>
<a name="circuitnamedboxfixedsize" val="true"/>
<a name="simulationFrequency" val="1.0"/>
<comp lib="0" loc="(120,230)" name="Clock"/>
<comp lib="0" loc="(210,160)" name="Splitter">
<a name="appear" val="center"/>
<a name="facing" val="north"/>
<a name="fanout" val="32"/>
<a name="incoming" val="32"/>
</comp>
<comp lib="0" loc="(370,170)" name="Splitter">
<a name="bit0" val="1"/>
<a name="bit10" val="1"/>
<a name="bit11" val="1"/>
<a name="bit12" val="1"/>
<a name="bit13" val="1"/>
<a name="bit14" val="1"/>
<a name="bit15" val="1"/>
<a name="bit16" val="1"/>
<a name="bit17" val="1"/>
<a name="bit18" val="1"/>
<a name="bit19" val="1"/>
<a name="bit2" val="1"/>
<a name="bit20" val="1"/>
<a name="bit21" val="1"/>
<a name="bit22" val="1"/>
<a name="bit23" val="1"/>
<a name="bit24" val="1"/>
<a name="bit25" val="1"/>
<a name="bit26" val="1"/>
<a name="bit27" val="1"/>
<a name="bit28" val="1"/>
<a name="bit29" val="1"/>
<a name="bit3" val="1"/>
<a name="bit30" val="1"/>
<a name="bit31" val="0"/>
<a name="bit4" val="1"/>
<a name="bit5" val="1"/>
<a name="bit6" val="1"/>
<a name="bit7" val="1"/>
<a name="bit8" val="1"/>
<a name="bit9" val="1"/>
<a name="incoming" val="32"/>
<a name="spacing" val="3"/>
</comp>
<comp lib="0" loc="(370,270)" name="Splitter">
<a name="appear" val="right"/>
<a name="bit0" val="1"/>
<a name="bit1" val="0"/>
<a name="bit10" val="0"/>
<a name="bit11" val="0"/>
<a name="bit12" val="0"/>
<a name="bit13" val="0"/>
<a name="bit14" val="0"/>
<a name="bit15" val="0"/>
<a name="bit16" val="0"/>
<a name="bit17" val="0"/>
<a name="bit18" val="0"/>
<a name="bit19" val="0"/>
<a name="bit2" val="0"/>
<a name="bit20" val="0"/>
<a name="bit21" val="0"/>
<a name="bit22" val="0"/>
<a name="bit23" val="0"/>
<a name="bit24" val="0"/>
<a name="bit25" val="0"/>
<a name="bit26" val="0"/>
<a name="bit27" val="0"/>
<a name="bit28" val="0"/>
<a name="bit29" val="0"/>
<a name="bit3" val="0"/>
<a name="bit30" val="0"/>
<a name="bit31" val="0"/>
<a name="bit4" val="0"/>
<a name="bit5" val="0"/>
<a name="bit6" val="0"/>
<a name="bit7" val="0"/>
<a name="bit8" val="0"/>
<a name="bit9" val="0"/>
<a name="incoming" val="32"/>
<a name="spacing" val="3"/>
</comp>
<comp lib="0" loc="(450,160)" name="Constant">
<a name="value" val="0x0"/>
</comp>
<comp lib="0" loc="(450,280)" name="Constant">
<a name="value" val="0x0"/>
</comp>
<comp lib="0" loc="(470,170)" name="Splitter">
<a name="appear" val="right"/>
<a name="bit0" val="1"/>
<a name="bit1" val="0"/>
<a name="bit10" val="0"/>
<a name="bit11" val="0"/>
<a name="bit12" val="0"/>
<a name="bit13" val="0"/>
<a name="bit14" val="0"/>
<a name="bit15" val="0"/>
<a name="bit16" val="0"/>
<a name="bit17" val="0"/>
<a name="bit18" val="0"/>
<a name="bit19" val="0"/>
<a name="bit2" val="0"/>
<a name="bit20" val="0"/>
<a name="bit21" val="0"/>
<a name="bit22" val="0"/>
<a name="bit23" val="0"/>
<a name="bit24" val="0"/>
<a name="bit25" val="0"/>
<a name="bit26" val="0"/>
<a name="bit27" val="0"/>
<a name="bit28" val="0"/>
<a name="bit29" val="0"/>
<a name="bit3" val="0"/>
<a name="bit30" val="0"/>
<a name="bit31" val="0"/>
<a name="bit4" val="0"/>
<a name="bit5" val="0"/>
<a name="bit6" val="0"/>
<a name="bit7" val="0"/>
<a name="bit8" val="0"/>
<a name="bit9" val="0"/>
<a name="facing" val="west"/>
<a name="incoming" val="32"/>
<a name="spacing" val="3"/>
</comp>
<comp lib="0" loc="(470,320)" name="Splitter">
<a name="appear" val="right"/>
<a name="bit0" val="1"/>
<a name="bit10" val="1"/>
<a name="bit11" val="1"/>
<a name="bit12" val="1"/>
<a name="bit13" val="1"/>
<a name="bit14" val="1"/>
<a name="bit15" val="1"/>
<a name="bit16" val="1"/>
<a name="bit17" val="1"/>
<a name="bit18" val="1"/>
<a name="bit19" val="1"/>
<a name="bit2" val="1"/>
<a name="bit20" val="1"/>
<a name="bit21" val="1"/>
<a name="bit22" val="1"/>
<a name="bit23" val="1"/>
<a name="bit24" val="1"/>
<a name="bit25" val="1"/>
<a name="bit26" val="1"/>
<a name="bit27" val="1"/>
<a name="bit28" val="1"/>
<a name="bit29" val="1"/>
<a name="bit3" val="1"/>
<a name="bit30" val="1"/>
<a name="bit31" val="0"/>
<a name="bit4" val="1"/>
<a name="bit5" val="1"/>
<a name="bit6" val="1"/>
<a name="bit7" val="1"/>
<a name="bit8" val="1"/>
<a name="bit9" val="1"/>
<a name="facing" val="west"/>
<a name="incoming" val="32"/>
<a name="spacing" val="3"/>
</comp>
<comp lib="0" loc="(510,150)" name="Constant">
<a name="facing" val="south"/>
</comp>
<comp lib="1" loc="(120,340)" name="NOT Gate">
<a name="facing" val="north"/>
</comp>
<comp lib="1" loc="(190,230)" name="AND Gate">
<a name="inputs" val="3"/>
</comp>
<comp lib="1" loc="(200,70)" name="OR Gate">
<a name="facing" val="north"/>
<a name="inputs" val="31"/>
<a name="size" val="70"/>
</comp>
<comp lib="1" loc="(600,110)" name="OR Gate">
<a name="size" val="30"/>
</comp>
<comp lib="1" loc="(680,50)" name="NOT Gate"/>
<comp lib="1" loc="(710,120)" name="AND Gate">
<a name="size" val="30"/>
</comp>
<comp lib="1" loc="(710,60)" name="AND Gate">
<a name="size" val="30"/>
</comp>
<comp lib="2" loc="(630,190)" name="Multiplexer">
<a name="width" val="32"/>
</comp>
<comp lib="3" loc="(530,180)" name="Adder">
<a name="width" val="32"/>
</comp>
<comp lib="4" loc="(290,160)" name="Register">
<a name="appearance" val="logisim_evolution"/>
<a name="width" val="32"/>
</comp>
<comp lib="5" loc="(750,120)" name="LED"/>
<comp lib="5" loc="(750,60)" name="LED"/>
<comp lib="6" loc="(35,450)" name="Text">
<a name="font" val="SansSerif plain 16"/>
<a name="halign" val="left"/>
<a name="text" val="If a number doesn't converge, the circuit will loop forever"/>
</comp>
<comp lib="6" loc="(35,470)" name="Text">
<a name="font" val="SansSerif plain 16"/>
<a name="halign" val="left"/>
<a name="text" val="For example, external hardware could limit the number of iterations"/>
<a name="valign" val="center"/>
</comp>
<comp lib="6" loc="(35,500)" name="Text">
<a name="font" val="SansSerif plain 16"/>
<a name="halign" val="left"/>
<a name="text" val="and analyze numbers that exceed it in more detail"/>
</comp>
<comp lib="6" loc="(405,345)" name="Text">
<a name="font" val="SansSerif bold 12"/>
<a name="text" val="ODD"/>
</comp>
<comp lib="6" loc="(440,215)" name="Text">
<a name="font" val="SansSerif bold 12"/>
<a name="text" val="3x + 1 = 2x + x + 1"/>
</comp>
<comp lib="6" loc="(440,230)" name="Text">
<a name="font" val="SansSerif bold 12"/>
<a name="text" val="2x = x &lt;&lt; 1"/>
</comp>
<comp lib="6" loc="(520,305)" name="Text">
<a name="font" val="SansSerif bold 12"/>
<a name="text" val="x / 2 = x &gt;&gt; 1"/>
</comp>
<comp lib="6" loc="(775,125)" name="Text">
<a name="halign" val="left"/>
<a name="text" val="OVERFLOW"/>
</comp>
<comp lib="6" loc="(775,65)" name="Text">
<a name="halign" val="left"/>
<a name="text" val="CONVERGES"/>
</comp>
<wire from="(120,230)" to="(140,230)"/>
<wire from="(120,250)" to="(120,340)"/>
<wire from="(120,250)" to="(140,250)"/>
<wire from="(120,370)" to="(120,410)"/>
<wire from="(120,410)" to="(730,410)"/>
<wire from="(190,230)" to="(290,230)"/>
<wire from="(200,50)" to="(200,70)"/>
<wire from="(200,50)" to="(650,50)"/>
<wire from="(210,160)" to="(210,190)"/>
<wire from="(210,190)" to="(210,370)"/>
<wire from="(210,190)" to="(290,190)"/>
<wire from="(210,370)" to="(640,370)"/>
<wire from="(350,190)" to="(370,190)"/>
<wire from="(360,70)" to="(360,140)"/>
<wire from="(360,70)" to="(680,70)"/>
<wire from="(370,170)" to="(370,190)"/>
<wire from="(370,190)" to="(370,270)"/>
<wire from="(370,190)" to="(490,190)"/>
<wire from="(390,100)" to="(390,130)"/>
<wire from="(390,100)" to="(570,100)"/>
<wire from="(390,160)" to="(420,160)"/>
<wire from="(390,280)" to="(420,280)"/>
<wire from="(390,310)" to="(390,350)"/>
<wire from="(390,350)" to="(610,350)"/>
<wire from="(40,210)" to="(140,210)"/>
<wire from="(40,50)" to="(200,50)"/>
<wire from="(40,50)" to="(40,210)"/>
<wire from="(420,130)" to="(420,160)"/>
<wire from="(420,130)" to="(450,130)"/>
<wire from="(420,280)" to="(420,310)"/>
<wire from="(420,310)" to="(450,310)"/>
<wire from="(470,170)" to="(490,170)"/>
<wire from="(470,320)" to="(580,320)"/>
<wire from="(510,150)" to="(510,160)"/>
<wire from="(510,200)" to="(510,210)"/>
<wire from="(510,210)" to="(540,210)"/>
<wire from="(530,180)" to="(560,180)"/>
<wire from="(540,120)" to="(540,210)"/>
<wire from="(540,120)" to="(570,120)"/>
<wire from="(560,180)" to="(560,200)"/>
<wire from="(560,200)" to="(600,200)"/>
<wire from="(580,180)" to="(580,320)"/>
<wire from="(580,180)" to="(600,180)"/>
<wire from="(600,110)" to="(680,110)"/>
<wire from="(610,210)" to="(610,350)"/>
<wire from="(610,350)" to="(660,350)"/>
<wire from="(630,190)" to="(640,190)"/>
<wire from="(640,190)" to="(640,370)"/>
<wire from="(660,130)" to="(660,350)"/>
<wire from="(660,130)" to="(680,130)"/>
<wire from="(710,120)" to="(730,120)"/>
<wire from="(710,60)" to="(750,60)"/>
<wire from="(730,120)" to="(730,410)"/>
<wire from="(730,120)" to="(750,120)"/>
</circuit>
</project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment