From 734b7a8893943cc2b7495004bf6754efa2b6f841 Mon Sep 17 00:00:00 2001 From: Date: Wed, 6 Sep 2017 19:29:59 -0400 Subject: [PATCH] pre release --- README.md | 29 + src/main/java/GraphBuilder/GraphBuilder.java | 923 +++++ .../GraphBuilder/json_representations.zip | Bin 0 -> 2798 bytes .../json_representations/JCell.java | 48 + .../json_representations/JPort.java | 35 + .../json_representations/JsonFile.java | 32 + .../json_representations/JsonParseTest.java | 24 + .../json_representations/Module.java | 31 + .../json_representations/Node.java | 14 + src/main/java/MinecraftGraph/Function.java | 42 + .../java/MinecraftGraph/FunctionType.java | 5 + src/main/java/MinecraftGraph/Graph.java | 81 + src/main/java/MinecraftGraph/In_output.java | 21 + src/main/java/MinecraftGraph/MuxVertex.java | 28 + src/main/java/MinecraftGraph/Vertex.java | 77 + src/main/java/MinecraftGraph/VertexType.java | 5 + src/main/java/minecrafthdl/ClientProxy.java | 29 + src/main/java/minecrafthdl/CommonProxy.java | 26 + src/main/java/minecrafthdl/Demo.java | 82 + src/main/java/minecrafthdl/MHDLException.java | 9 + src/main/java/minecrafthdl/MinecraftHDL.java | 52 + src/main/java/minecrafthdl/ServerProxy.java | 27 + src/main/java/minecrafthdl/Utils.java | 41 + .../java/minecrafthdl/block/BasicBlock.java | 28 + .../java/minecrafthdl/block/ModBlocks.java | 17 + .../block/blocks/Synthesizer.java | 136 + .../render/blocks/BlockRenderRegister.java | 22 + .../gui/MinecraftHDLGuiHandler.java | 26 + .../java/minecrafthdl/gui/SynthesiserGUI.java | 233 ++ .../java/minecrafthdl/synthesis/Circuit.java | 115 + .../minecrafthdl/synthesis/CircuitTest.java | 49 + .../java/minecrafthdl/synthesis/Gate.java | 20 + .../synthesis/IntermediateCircuit.java | 267 ++ .../minecrafthdl/synthesis/LogicGates.java | 193 + .../synthesis/routing/Channel.java | 355 ++ .../minecrafthdl/synthesis/routing/Net.java | 103 + .../synthesis/routing/Router.java | 174 + .../synthesis/routing/pins/EmptyPin.java | 21 + .../synthesis/routing/pins/GatePins.java | 80 + .../synthesis/routing/pins/MuxPins.java | 55 + .../synthesis/routing/pins/Pin.java | 41 + .../synthesis/routing/pins/PinPair.java | 15 + .../synthesis/routing/pins/PinsArray.java | 58 + .../routing/vcg/VerticalConstraintGraph.java | 140 + .../minecrafthdl/testing/RouterTesting.java | 25 + .../java/minecrafthdl/testing/TestGate.java | 45 + .../minecrafthdl/testing/TestLogicGates.java | 110 + src/main/main.iml | 11 + .../blockstates/tutorial_block.json | 10 + .../models/block/tutorial_block.json | 6 + .../models/item/tutorial_block.json | 10 + .../textures/blocks/tutorial_block.png | Bin 0 -> 307 bytes .../minecrafthdl/textures/gui/synthesiser.png | Bin 0 -> 1751 bytes src/main/resources/mcmod.info | 16 + src/main/tests/Verilogfiles/and.v | 7 + src/main/tests/Verilogfiles/counter.v | 24 + src/main/tests/Verilogfiles/multiplexer.v | 17 + src/main/tests/Verilogfiles/onebitadder.v | 21 + src/main/tests/Verilogfiles/or.v | 5 + src/main/tests/Verilogfiles/test1.v | 7 + src/main/tests/Verilogfiles/test23.v | 15 + src/main/tests/Verilogfiles/test33.v | 11 + src/main/tests/Verilogfiles/testAND.v | 4 + src/main/tests/Verilogfiles/testAO.v | 13 + src/main/tests/Verilogfiles/testMajority.v | 8 + src/main/tests/Verilogfiles/test_arrays.v | 8 + src/main/tests/Verilogfiles/test_pattern.v | 62 + src/main/tests/json | 0 src/main/tests/json files/and.json | 981 +++++ src/main/tests/json files/counter.json | 874 +++++ src/main/tests/json files/multiplexer.json | 64 + src/main/tests/json files/or.json | 78 + src/main/tests/json files/pattern.json | 334 ++ src/main/tests/json files/test12.json | 287 ++ src/main/tests/json files/test23.json | 172 + src/main/tests/json files/test33.json | 143 + src/main/tests/json files/testAO.json | 558 +++ src/main/tests/json files/testMajority.json | 212 ++ src/main/tests/json files/test_arrays.json | 73 + verilog/mac/autoyosys/auto.ysy | 5 + verilog/mac/autoyosys/tmp.json | 420 +++ verilog/mac/autoyosys/tmp.v | 17 + verilog/mac/synth.sh | 10 + verilog/windows/autoyosys/auto.ysy | 5 + verilog/windows/autoyosys/pthreadVC2.dll | Bin 0 -> 86070 bytes verilog/windows/autoyosys/readme.txt | 2 + verilog/windows/autoyosys/share/adff2dff.v | 27 + verilog/windows/autoyosys/share/cells.lib | 108 + .../windows/autoyosys/share/gowin/cells_map.v | 31 + .../windows/autoyosys/share/gowin/cells_sim.v | 51 + .../autoyosys/share/greenpak4/cells_map.v | 94 + .../autoyosys/share/greenpak4/cells_sim.v | 461 +++ .../autoyosys/share/greenpak4/gp_dff.lib | 36 + .../windows/autoyosys/share/ice40/arith_map.v | 70 + .../windows/autoyosys/share/ice40/brams.txt | 40 + .../autoyosys/share/ice40/brams_init1.vh | 544 +++ .../autoyosys/share/ice40/brams_init2.vh | 544 +++ .../autoyosys/share/ice40/brams_init3.vh | 544 +++ .../windows/autoyosys/share/ice40/brams_map.v | 311 ++ .../windows/autoyosys/share/ice40/cells_map.v | 57 + .../windows/autoyosys/share/ice40/cells_sim.v | 883 +++++ .../autoyosys/share/ice40/latches_map.v | 11 + .../include/backends/ilang/ilang_backend.h | 51 + .../share/include/frontends/ast/ast.h | 319 ++ .../share/include/kernel/celledges.h | 63 + .../share/include/kernel/celltypes.h | 449 +++ .../share/include/kernel/consteval.h | 383 ++ .../autoyosys/share/include/kernel/hashlib.h | 1052 ++++++ .../autoyosys/share/include/kernel/log.h | 308 ++ .../autoyosys/share/include/kernel/macc.h | 242 ++ .../autoyosys/share/include/kernel/modtools.h | 582 +++ .../autoyosys/share/include/kernel/register.h | 129 + .../autoyosys/share/include/kernel/rtlil.h | 1348 +++++++ .../autoyosys/share/include/kernel/satgen.h | 1411 +++++++ .../autoyosys/share/include/kernel/sigtools.h | 332 ++ .../autoyosys/share/include/kernel/utils.h | 214 ++ .../autoyosys/share/include/kernel/yosys.h | 311 ++ .../share/include/libs/ezsat/ezminisat.h | 71 + .../share/include/libs/ezsat/ezsat.h | 359 ++ .../autoyosys/share/include/libs/sha1/sha1.h | 57 + .../share/include/passes/fsm/fsmdata.h | 178 + verilog/windows/autoyosys/share/pmux2mux.v | 21 + verilog/windows/autoyosys/share/simcells.v | 1276 +++++++ verilog/windows/autoyosys/share/simlib.v | 1818 +++++++++ verilog/windows/autoyosys/share/techmap.v | 459 +++ .../autoyosys/share/xilinx/arith_map.v | 91 + .../windows/autoyosys/share/xilinx/brams.txt | 105 + .../windows/autoyosys/share/xilinx/brams_bb.v | 319 ++ .../autoyosys/share/xilinx/brams_init_16.vh | 64 + .../autoyosys/share/xilinx/brams_init_18.vh | 1024 +++++ .../autoyosys/share/xilinx/brams_init_32.vh | 128 + .../autoyosys/share/xilinx/brams_init_36.vh | 2048 ++++++++++ .../autoyosys/share/xilinx/brams_map.v | 359 ++ .../autoyosys/share/xilinx/cells_map.v | 84 + .../autoyosys/share/xilinx/cells_sim.v | 158 + .../autoyosys/share/xilinx/cells_xtra.v | 3293 +++++++++++++++++ .../windows/autoyosys/share/xilinx/drams.txt | 36 + .../windows/autoyosys/share/xilinx/drams_bb.v | 20 + .../autoyosys/share/xilinx/drams_map.v | 63 + verilog/windows/autoyosys/tmp.json | 284 ++ verilog/windows/autoyosys/tmp.v | 14 + verilog/windows/autoyosys/yosys-abc.exe | Bin 0 -> 12452864 bytes verilog/windows/autoyosys/yosys.exe | Bin 0 -> 5452288 bytes verilog/windows/synth.bat | 15 + 144 files changed, 31829 insertions(+) create mode 100644 README.md create mode 100644 src/main/java/GraphBuilder/GraphBuilder.java create mode 100644 src/main/java/GraphBuilder/json_representations.zip create mode 100644 src/main/java/GraphBuilder/json_representations/JCell.java create mode 100644 src/main/java/GraphBuilder/json_representations/JPort.java create mode 100644 src/main/java/GraphBuilder/json_representations/JsonFile.java create mode 100644 src/main/java/GraphBuilder/json_representations/JsonParseTest.java create mode 100644 src/main/java/GraphBuilder/json_representations/Module.java create mode 100644 src/main/java/GraphBuilder/json_representations/Node.java create mode 100644 src/main/java/MinecraftGraph/Function.java create mode 100644 src/main/java/MinecraftGraph/FunctionType.java create mode 100644 src/main/java/MinecraftGraph/Graph.java create mode 100644 src/main/java/MinecraftGraph/In_output.java create mode 100644 src/main/java/MinecraftGraph/MuxVertex.java create mode 100644 src/main/java/MinecraftGraph/Vertex.java create mode 100644 src/main/java/MinecraftGraph/VertexType.java create mode 100644 src/main/java/minecrafthdl/ClientProxy.java create mode 100644 src/main/java/minecrafthdl/CommonProxy.java create mode 100644 src/main/java/minecrafthdl/Demo.java create mode 100644 src/main/java/minecrafthdl/MHDLException.java create mode 100644 src/main/java/minecrafthdl/MinecraftHDL.java create mode 100644 src/main/java/minecrafthdl/ServerProxy.java create mode 100644 src/main/java/minecrafthdl/Utils.java create mode 100644 src/main/java/minecrafthdl/block/BasicBlock.java create mode 100644 src/main/java/minecrafthdl/block/ModBlocks.java create mode 100644 src/main/java/minecrafthdl/block/blocks/Synthesizer.java create mode 100644 src/main/java/minecrafthdl/client/render/blocks/BlockRenderRegister.java create mode 100644 src/main/java/minecrafthdl/gui/MinecraftHDLGuiHandler.java create mode 100644 src/main/java/minecrafthdl/gui/SynthesiserGUI.java create mode 100644 src/main/java/minecrafthdl/synthesis/Circuit.java create mode 100644 src/main/java/minecrafthdl/synthesis/CircuitTest.java create mode 100644 src/main/java/minecrafthdl/synthesis/Gate.java create mode 100644 src/main/java/minecrafthdl/synthesis/IntermediateCircuit.java create mode 100644 src/main/java/minecrafthdl/synthesis/LogicGates.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/Channel.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/Net.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/Router.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/pins/EmptyPin.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/pins/GatePins.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/pins/MuxPins.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/pins/Pin.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/pins/PinPair.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/pins/PinsArray.java create mode 100644 src/main/java/minecrafthdl/synthesis/routing/vcg/VerticalConstraintGraph.java create mode 100644 src/main/java/minecrafthdl/testing/RouterTesting.java create mode 100644 src/main/java/minecrafthdl/testing/TestGate.java create mode 100644 src/main/java/minecrafthdl/testing/TestLogicGates.java create mode 100644 src/main/main.iml create mode 100644 src/main/resources/assets/minecrafthdl/blockstates/tutorial_block.json create mode 100644 src/main/resources/assets/minecrafthdl/models/block/tutorial_block.json create mode 100644 src/main/resources/assets/minecrafthdl/models/item/tutorial_block.json create mode 100644 src/main/resources/assets/minecrafthdl/textures/blocks/tutorial_block.png create mode 100644 src/main/resources/assets/minecrafthdl/textures/gui/synthesiser.png create mode 100644 src/main/resources/mcmod.info create mode 100644 src/main/tests/Verilogfiles/and.v create mode 100644 src/main/tests/Verilogfiles/counter.v create mode 100644 src/main/tests/Verilogfiles/multiplexer.v create mode 100644 src/main/tests/Verilogfiles/onebitadder.v create mode 100644 src/main/tests/Verilogfiles/or.v create mode 100644 src/main/tests/Verilogfiles/test1.v create mode 100644 src/main/tests/Verilogfiles/test23.v create mode 100644 src/main/tests/Verilogfiles/test33.v create mode 100644 src/main/tests/Verilogfiles/testAND.v create mode 100644 src/main/tests/Verilogfiles/testAO.v create mode 100644 src/main/tests/Verilogfiles/testMajority.v create mode 100644 src/main/tests/Verilogfiles/test_arrays.v create mode 100644 src/main/tests/Verilogfiles/test_pattern.v create mode 100644 src/main/tests/json create mode 100644 src/main/tests/json files/and.json create mode 100644 src/main/tests/json files/counter.json create mode 100644 src/main/tests/json files/multiplexer.json create mode 100644 src/main/tests/json files/or.json create mode 100644 src/main/tests/json files/pattern.json create mode 100644 src/main/tests/json files/test12.json create mode 100644 src/main/tests/json files/test23.json create mode 100644 src/main/tests/json files/test33.json create mode 100644 src/main/tests/json files/testAO.json create mode 100644 src/main/tests/json files/testMajority.json create mode 100644 src/main/tests/json files/test_arrays.json create mode 100644 verilog/mac/autoyosys/auto.ysy create mode 100644 verilog/mac/autoyosys/tmp.json create mode 100644 verilog/mac/autoyosys/tmp.v create mode 100644 verilog/mac/synth.sh create mode 100644 verilog/windows/autoyosys/auto.ysy create mode 100644 verilog/windows/autoyosys/pthreadVC2.dll create mode 100644 verilog/windows/autoyosys/readme.txt create mode 100644 verilog/windows/autoyosys/share/adff2dff.v create mode 100644 verilog/windows/autoyosys/share/cells.lib create mode 100644 verilog/windows/autoyosys/share/gowin/cells_map.v create mode 100644 verilog/windows/autoyosys/share/gowin/cells_sim.v create mode 100644 verilog/windows/autoyosys/share/greenpak4/cells_map.v create mode 100644 verilog/windows/autoyosys/share/greenpak4/cells_sim.v create mode 100644 verilog/windows/autoyosys/share/greenpak4/gp_dff.lib create mode 100644 verilog/windows/autoyosys/share/ice40/arith_map.v create mode 100644 verilog/windows/autoyosys/share/ice40/brams.txt create mode 100644 verilog/windows/autoyosys/share/ice40/brams_init1.vh create mode 100644 verilog/windows/autoyosys/share/ice40/brams_init2.vh create mode 100644 verilog/windows/autoyosys/share/ice40/brams_init3.vh create mode 100644 verilog/windows/autoyosys/share/ice40/brams_map.v create mode 100644 verilog/windows/autoyosys/share/ice40/cells_map.v create mode 100644 verilog/windows/autoyosys/share/ice40/cells_sim.v create mode 100644 verilog/windows/autoyosys/share/ice40/latches_map.v create mode 100644 verilog/windows/autoyosys/share/include/backends/ilang/ilang_backend.h create mode 100644 verilog/windows/autoyosys/share/include/frontends/ast/ast.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/celledges.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/celltypes.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/consteval.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/hashlib.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/log.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/macc.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/modtools.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/register.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/rtlil.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/satgen.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/sigtools.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/utils.h create mode 100644 verilog/windows/autoyosys/share/include/kernel/yosys.h create mode 100644 verilog/windows/autoyosys/share/include/libs/ezsat/ezminisat.h create mode 100644 verilog/windows/autoyosys/share/include/libs/ezsat/ezsat.h create mode 100644 verilog/windows/autoyosys/share/include/libs/sha1/sha1.h create mode 100644 verilog/windows/autoyosys/share/include/passes/fsm/fsmdata.h create mode 100644 verilog/windows/autoyosys/share/pmux2mux.v create mode 100644 verilog/windows/autoyosys/share/simcells.v create mode 100644 verilog/windows/autoyosys/share/simlib.v create mode 100644 verilog/windows/autoyosys/share/techmap.v create mode 100644 verilog/windows/autoyosys/share/xilinx/arith_map.v create mode 100644 verilog/windows/autoyosys/share/xilinx/brams.txt create mode 100644 verilog/windows/autoyosys/share/xilinx/brams_bb.v create mode 100644 verilog/windows/autoyosys/share/xilinx/brams_init_16.vh create mode 100644 verilog/windows/autoyosys/share/xilinx/brams_init_18.vh create mode 100644 verilog/windows/autoyosys/share/xilinx/brams_init_32.vh create mode 100644 verilog/windows/autoyosys/share/xilinx/brams_init_36.vh create mode 100644 verilog/windows/autoyosys/share/xilinx/brams_map.v create mode 100644 verilog/windows/autoyosys/share/xilinx/cells_map.v create mode 100644 verilog/windows/autoyosys/share/xilinx/cells_sim.v create mode 100644 verilog/windows/autoyosys/share/xilinx/cells_xtra.v create mode 100644 verilog/windows/autoyosys/share/xilinx/drams.txt create mode 100644 verilog/windows/autoyosys/share/xilinx/drams_bb.v create mode 100644 verilog/windows/autoyosys/share/xilinx/drams_map.v create mode 100644 verilog/windows/autoyosys/tmp.json create mode 100644 verilog/windows/autoyosys/tmp.v create mode 100644 verilog/windows/autoyosys/yosys-abc.exe create mode 100644 verilog/windows/autoyosys/yosys.exe create mode 100644 verilog/windows/synth.bat diff --git a/README.md b/README.md new file mode 100644 index 0000000..358beae --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Setting up the development environment + + +## 1. Get Intellij IDEA +Download it [here](https://www.jetbrains.com/idea/specials/idea/idea.html?&gclid=CjwKEAjwydK_BRDK34GenvLB61YSJACZ8da3DYKMBBJKwurnBjpJjU_oTfSrQp7vRMZi97t2dUEDjhoCQSfw_wcB&gclsrc=aw.ds.ds&dclid=CN6cteOtxM8CFUYFDAodlPQLdQ) +*set your theme to dark because white themes are for losers + +## 2. Get MinecraftForge +Download [here](https://files.minecraftforge.net/), get the MDK version (1.10.2 - 12.18.1.2011) for minecraft 1.10 +This is the version under "Download recomended" as of the writing of this file. +Extract it in the folder where you want the project to be located + +## 3. Follow the video +this [video](https://www.youtube.com/watch?v=PfmlNiHonV0) + +## 4. Open a terminal window with Git installed +navigate to the folder in which you extracted the MDK + +## 5. set up Git +Run these commands: +``` +$ git init +$ git remote add origin https://github.com/itsFrank/MinecraftHDL.git +$ git pull origin master +``` + +**Delete the package 'com.example.examplemod' and all its contents + +## 6. Branch out from master and have fun! \ No newline at end of file diff --git a/src/main/java/GraphBuilder/GraphBuilder.java b/src/main/java/GraphBuilder/GraphBuilder.java new file mode 100644 index 0000000..1d56537 --- /dev/null +++ b/src/main/java/GraphBuilder/GraphBuilder.java @@ -0,0 +1,923 @@ +package GraphBuilder; + +import GraphBuilder.json_representations.JCell; +import GraphBuilder.json_representations.JPort; +import GraphBuilder.json_representations.JsonFile; +import GraphBuilder.json_representations.Module; +import MinecraftGraph.*; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonReader; +import minecrafthdl.MHDLException; + +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; + + +//main class +//json file->javaObject->Vertex->graph +public class GraphBuilder { + private static ArrayList ports_names=new ArrayList(); + private static ArrayList cells_names=new ArrayList(); + private static ArrayList ports=new ArrayList(); + private static ArrayList cells=new ArrayList(); + + private static ArrayList inputs=new ArrayList(); + private static ArrayList outputs=new ArrayList(); + private static ArrayList gates=new ArrayList(); + + static int test_i = 1; + + static int high_low_nets = Integer.MAX_VALUE; + static int cell_ids = 0; + static HashMap from_net = new HashMap(); + static HashMap> to_net = new HashMap>(); + + public static int putInToNet(int i, Vertex v, Graph g){ + ArrayList l = to_net.get(i); + + if (i == 0) { + high_low_nets--; + Function f = new Function(cell_ids++, FunctionType.LOW, 0); + from_net.put(high_low_nets, f); + to_net.put(high_low_nets, new ArrayList()); + to_net.get(high_low_nets).add(v); + g.addVertex(f); + return high_low_nets; + } else if (i == 1){ + high_low_nets--; + Function f = new Function(cell_ids++, FunctionType.HIGH, 0); + from_net.put(high_low_nets, f); + to_net.put(high_low_nets, new ArrayList()); + to_net.get(high_low_nets).add(v); + g.addVertex(f); + return high_low_nets; + } else { + if (l == null) to_net.put(i, new ArrayList()); + to_net.get(i).add(v); + return i; + } + + } + + public static int putInFromNet(int i, Vertex v){ + Vertex vr = from_net.get(i); + + if (vr != null) throw new MHDLException("TWO OUTPUTS ON SAME NET"); + from_net.put(i, v); + return i; + } + + public static Graph buildGraph(String path){ + high_low_nets = Integer.MAX_VALUE; + + Gson gson= new com.google.gson.Gson(); + JsonFile jf = null; + try { + FileReader fr = new FileReader(path); + JsonReader jreader = new JsonReader(fr); + jreader.setLenient(true); + jf = gson.fromJson(jreader, JsonFile.class); + fr.close(); + jreader.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + jf.postInit(); + + Graph g = new Graph(); + + Module m = jf.modules.values().iterator().next(); + + from_net = new HashMap(); + to_net = new HashMap>(); + + for (String p_name : m.ports.keySet()){ + JPort p = m.ports.get(p_name); + + In_output io; + + if (p.direction.equals("input")){ + + io = new In_output(p.bits.size(), VertexType.INPUT, p_name); + + for (int i : p.bits){ + putInFromNet(i, io); + } + + } else { + + io = new In_output(p.bits.size(), VertexType.OUTPUT, p_name); + + for (int i : p.bits){ + putInToNet(i, io, g); + } + + } + + g.addVertex(io); + } + + cell_ids = 0; + + for (String c_name : m.cells.keySet()){ + JCell c = m.cells.get(c_name); + + FunctionType f_type = resolveType(c.type); + + Function f; + + if (f_type == FunctionType.MUX){ + f = new MuxVertex(cell_ids++, f_type, c.numInputs()); + } else { + f = new Function(cell_ids++, f_type, c.numInputs()); + } + + for (String conn_name : c.connections.keySet()){ + String direction = c.port_directions.get(conn_name); + ArrayList conn_nets = c.connections.get(conn_name); + + int conn_net = -1; + + if (direction.equals("input")){ + for (int i : conn_nets){ + conn_net = putInToNet(i, f, g); + } + } else { + for (int i : conn_nets){ + conn_net = putInFromNet(i, f); + } + } + + if (f_type == FunctionType.MUX){ + if (conn_name.equals("S")){ + ((MuxVertex) f).s_net_num = conn_net; + } else if (conn_name.equals(("A"))) { + ((MuxVertex) f).a_net_num = conn_net; + } else if (conn_name.equals(("B"))) { + ((MuxVertex) f).b_net_num = conn_net; + } + } + } + + g.addVertex(f); + } + + for (int i : to_net.keySet()){ + for (Vertex v : to_net.get(i)){ + Vertex from = from_net.get(i); + if (from == null){ + throw new MHDLException("NET HAS NO FROM VERTEX"); + } + + if (v.type == VertexType.FUNCTION){ + Function f = ((Function) v); + if (((Function) v).func_type == FunctionType.MUX){ + MuxVertex mux = ((MuxVertex) f); + + if (i == mux.a_net_num){ + mux.a_vertex = from; + } else if (i == mux.b_net_num){ + mux.b_vertex = from; + } else if (i == mux.s_net_num){ + mux.s_vertex = from; + } + } + } + + g.addEdge(from, v); + } + } + + return g; + } + + + public static Graph buildxGraph(String path){ + + ArrayList ports_names=new ArrayList(); + ArrayList cells_names=new ArrayList(); + ArrayList ports=new ArrayList(); + ArrayList cells=new ArrayList(); + + ArrayList inputs=new ArrayList(); + ArrayList outputs=new ArrayList(); + ArrayList gates=new ArrayList(); + + test_i = 1; + System.out.println(test_i++); //1 + + + //create jsononjects + Gson gson= new com.google.gson.Gson(); + JsonFile jf = null; + try { + FileReader fr = new FileReader(path); + JsonReader jreader = new JsonReader(fr); + jreader.setLenient(true); + jf = gson.fromJson(jreader, JsonFile.class); + fr.close(); + jreader.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + System.out.println(test_i++); //2 + + + jf.postInit(); + + Module m = jf.modules.values().iterator().next(); + + if (m == null) return null; + + //read all ports names and create port objects + + for(String s: m.ports.keySet()){ + JPort p = m.ports.get(s); + Port port=new Port(s, p.direction, p.bits); + ports.add(port); + + + } + + System.out.println(test_i++); //3 + + + int j=1; //count to assign ids to gates + + for(String s: m.cells.keySet()){ + + JCell c = m.cells.get(s); + + ArrayList conn_list = new ArrayList(); + + for(JPort p : c.ports.values()){ + + conn_list.add(new Connection(p.direction, p.bits, p.name)); + + + + } + + + + Cell cell=new Cell(j, c.type, conn_list ); + + cells.add(cell); + j++; + } + + System.out.println(test_i++); //4 + + Graph graph=new Graph(); + + //add inputs to graph vertices + for(Port p: ports){ + if(p.direction.equals("input")){ + In_output in=new In_output(p.bits.size(), VertexType.INPUT, p.name); + inputs.add(in); + graph.addVertex(in); + } + else{ + outputs.add(new In_output(p.bits.size(), VertexType.OUTPUT, p.name)); + } + + + } + + System.out.println(test_i++); //5 + + + //add all cells + for(Cell c:cells){ + + Function v = null; + + FunctionType type = resolveType((c.type)); + if (type == FunctionType.MUX){ + Connection c_sel = c.getConn("S"); + + if (c_sel == null) { + throw new MHDLException("MUX MUST HAVE S INPUT"); + } + + v = new MuxVertex(c.id, type, c.inputs.size()); + } else { + v=new Function(c.id, resolveType(c.type), c.inputs.size()); + } + + gates.add(v); + graph.addVertex(v); + } + + System.out.println(test_i++); //6 + + + for(In_output v:outputs){ + graph.addVertex(v); + } + + System.out.println(test_i++); //7 + + + //resolve connections + for(Port port:ports){ + + for(Port toCom:ports){ + if(!port.equals(toCom)){ + int conn_count=areConnected(port.bits, toCom.bits); + if(port.direction.equals("input")&&toCom.direction.equals("output")&&conn_count>0){ + for(int h=0; h0){ + for(int h=0; h0){ + for(int h=0; h0){ + + for(int h=0; h0) + graph.addEdge(getVertex(graph, cell), getVertex(graph, c)); + } + + } + + } + + + System.out.println(test_i++); //9 + + optimizeGraph(graph); + System.out.println(test_i++); //10 + + return graph; + } + +// public static Graph buildxGraph(String path){ +// +// File file=new File(path); +// //Three string builder for the three json blocks: cells, ports, netnames +// StringBuilder sb1=new StringBuilder(); +// StringBuilder sb2=new StringBuilder(); +// StringBuilder sb3=new StringBuilder(); +// +// FileReader reader; +// BufferedReader b_r; +// +// String portsBlock=""; +// String cellsBlock=""; +// String netnamesBlock=""; +// +// String pattern = "[:{\"\\s]"; +// +// try { +// reader = new FileReader(file); +// b_r=new BufferedReader(reader); +// +// //skip first four lines +// b_r.readLine(); +// b_r.readLine(); +// b_r.readLine(); +// b_r.readLine(); +// +// int port_braces=1; +// String line=b_r.readLine(); +// +// sb1.append("{"); +// +// while(port_braces!=0){ +// sb1.append(line); +// line=b_r.readLine(); +// +// if(line.contains("{")){ +// ports_names.add(line.replaceAll(pattern, "")); +// port_braces++; +// } +// else if (line.contains("}")){port_braces--;} +// } +// sb1.append("}"); +// sb1.append("}"); +// portsBlock=sb1.toString(); +// +// //read gates block in the json file +// int cells_braces=1; +// line=b_r.readLine(); +// sb2.append("{"); +// +// while(cells_braces!= 0){ +// +// sb2.append(line); +// line=b_r.readLine(); +// +// if(line.contains("{")){ +// cells_braces++; +// if(cells_braces==2){ +// cells_names.add(line.replace(": {", "").replaceAll("[\"\\s]", "")); +// } +// } +// else if (line.contains("}")){cells_braces--;} +// +// +// +// } +// +// sb2.append("}"); +// sb2.append("}"); +// cellsBlock=sb2.toString(); +// +// +// +// }catch (FileNotFoundException e) { +// e.printStackTrace(); +// } catch (IOException f) { +// f.printStackTrace(); +// } +// +// //create jsononjects +// Gson gson= new com.google.gson.Gson(); +// System.out.println(portsBlock); +// +// JsonObject ports_obj=gson.fromJson(portsBlock, JsonElement.class).getAsJsonObject().get("ports").getAsJsonObject(); +// +// +// +// //read all ports names and create port objects +// +// for(String s: ports_names){ +// JsonObject js=ports_obj.get(s).getAsJsonObject(); +// Port port=new Port(s, js.get("direction").getAsString(), js.get("bits").getAsJsonArray()); +// ports.add(port); +// +// +// } +// +// JsonObject cells_obj=gson.fromJson(cellsBlock, JsonElement.class).getAsJsonObject().get("cells").getAsJsonObject(); +// +// +// int j=1; //count to assign ids to gates +// +// for(String c: cells_names){ +// +// JsonObject js_c=cells_obj.get(c).getAsJsonObject(); +// JsonObject param_obj=js_c.get("parameters").getAsJsonObject(); +// JsonObject conn_obj=js_c.get("connections").getAsJsonObject(); +// JsonObject dir_obj=js_c.get("port_directions").getAsJsonObject(); +// +// +// String[] param=param_obj.toString().replaceAll("[{]", "").split(","); +// String[] port_dir=conn_obj.toString().replaceAll("[{]", "").split(","); +// String[] conn=dir_obj.toString().replaceAll("[{]", "").split(","); +// ArrayList conn_list=new ArrayList<>(); +// +// for(int k=0; k0){ +// for(int h=0; h0){ +// for(int h=0; h0){ +// for(int h=0; h0){ +// +// for(int h=0; h0) +// graph.addEdge(getVertex(graph, cell), getVertex(graph, c)); +// } +// +// } +// +// } +// +// optimizeGraph(graph); +// return graph; +// } +// + private static void optimizeGraph(Graph graph){ + //iterate through all the nodes of the graph + //if or or and gate check outputs + //if all outputs are of the same type + //remove lower level and reconnect its inputs with the higher level + //got back + ArrayList verToRemove=new ArrayList(); + for(Vertex v: graph.getVertices()){ + System.out.println("vertex for"); + + //check if vertex is a gate + if(v.getType()==VertexType.FUNCTION){ + //check if gate type is and, or + Function f=(Function)v; + + FunctionType f_t=f.getFunc_Type(); + if(f_t==FunctionType.AND||f_t==FunctionType.OR){ + if(canMerge(f)){ + for(Vertex s:f.getNext()){ + System.out.println("vertex inner for"); + + graph.mergeVertices(f, s); + verToRemove.add(f); + } + + } + + } + } + + } + + for(Vertex t:verToRemove){ + System.out.println("vertex inner 2 for"); + + graph.removeVertex(t); + } + } + + private static boolean canMerge(Function v){ + for(Vertex x:v.getNext()){ + if(x.getType()!=VertexType.FUNCTION){ + return false; + + } + Function f=(Function)x; + if(f.getFunc_Type()!=v.getFunc_Type()){ + return false; + } + } + + return true; + + } + + + //getting vertices + + private static Vertex getVertex(Graph g, Port p){ + + for(Vertex v:g.getVertices()){ + + if(v.getID().equals(p.name)){ + return v; + } + + } + return null; + + } + + private static Vertex getVertex(Graph g, Cell p){ + + for(Vertex v:g.getVertices()){ + + if(v.getID().equals(String.valueOf(p.id))){ + return v; + } + + } + return null; + + } + + //checks if signals, gates are connected + private static int areConnected(ArrayList bits, ArrayList inputs2){ + + int count=0; + + for(Integer x: bits){ + for(Integer y: inputs2){ + if(x==y){ + count++; + } + + } + + } + return count; + + + } + + + + + private static int num_of_inputs(JsonObject j_o){ + int num=0; + char[] connection=j_o.get("connections").toString().toCharArray(); + for(char c: connection){ + if(c==':') num++; + } + return num-1; + } + + + + + private static FunctionType resolveType(String type){ + + //make sure that all string included + + if(type.contains("and")||type.contains("AND")){ + return FunctionType.AND; + + }else if(type.contains("MUX")||type.contains("mux")){ + return FunctionType.MUX; + }else if(type.contains("XOR")||type.contains("xor")){ + return FunctionType.XOR; + + }else if(type.contains("or")||type.contains("OR")){ + return FunctionType.OR; + + }else if(type.contains("dlatch_p")||type.contains("DLATCH_P")) { + return FunctionType.D_LATCH; + + }else if(type.contains("not")||type.contains("NOT")){ + return FunctionType.INV; + + }else{ + throw new MHDLException("Unknown Cell:" + type); + } + + + + } + +} + + + class Port{ + String name; + String direction; + ArrayList bits=new ArrayList(); + + public Port(String n, String d, ArrayList b){ + name=n; + direction=d; + bits=b; + } + + } + + class Cell{ + int id; + String type; + ArrayList connections=new ArrayList(); + + ArrayList inputs=new ArrayList(); + ArrayList outputs=new ArrayList(); + + public Cell(int i, String t, ArrayList cns){ + id=i; + type=t; + connections=cns; + + + for(Connection c:connections){ + if(c.direction.equals("input")){ + for(int j=0; j arr, String name){ + this.name = name; + direction=d; + IDs= new int[arr.size()]; + for(int j=0; j bits=new ArrayList<>(); +// +// public Port(String n, String d, JsonArray b){ +// name=n; +// direction=d; +// +// +// for(int i=0; i connections=new ArrayList<>(); +// +// ArrayList inputs=new ArrayList(); +// ArrayList outputs=new ArrayList<>(); +// +// public Cell(int i, String t, ArrayList cns){ +// id=i; +// type=t; +// connections=cns; +// +// +// for(Connection c:connections){ +// if(c.direction.equals("input")){ +// for(int j=0; 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 ZtS|inHwDuF2LQ0puVK2_3~c|r{SBj|o>~9^ literal 0 HcmV?d00001 diff --git a/src/main/java/GraphBuilder/json_representations/JCell.java b/src/main/java/GraphBuilder/json_representations/JCell.java new file mode 100644 index 0000000..e4c0f7f --- /dev/null +++ b/src/main/java/GraphBuilder/json_representations/JCell.java @@ -0,0 +1,48 @@ +package GraphBuilder.json_representations; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Created by Francis O'Brien - 4/3/2017 - 19:39 + */ + +public class JCell extends Node{ + + public String type; + public HashMap port_directions; + public HashMap> connections; + + public HashMap ports = new HashMap(); + + @Override + public ArrayList getNets() { + return null; + } + + public void posInit(){ + for (String p : port_directions.keySet()){ + ports.put(p, new JPort(p, port_directions.get(p), connections.get(p))); + } + + + } + + public int numInputs(){ + int conns = 0; + for (String dir: port_directions.values()){ + if (dir.equals("input")) conns += 1; + } + return conns; + } + + public void print(int tabs) { + System.out.println(JsonFile.tabs(tabs) + "type: " + type); + System.out.println(JsonFile.tabs(tabs) + "Ports: " + type); + + for (String p : ports.keySet()){ + System.out.println(JsonFile.tabs(tabs + 1) + p); + ports.get(p).print(tabs + 1); + } + } +} diff --git a/src/main/java/GraphBuilder/json_representations/JPort.java b/src/main/java/GraphBuilder/json_representations/JPort.java new file mode 100644 index 0000000..1e57902 --- /dev/null +++ b/src/main/java/GraphBuilder/json_representations/JPort.java @@ -0,0 +1,35 @@ +package GraphBuilder.json_representations; + +import java.util.ArrayList; + +/** + * Created by Francis O'Brien - 4/3/2017 - 19:39 + */ + +public class JPort extends Node { + public String name; + public String direction; + public ArrayList bits; + + public JPort(String name, String direction, ArrayList bits) { + this.name = name; + this.direction = direction; + this.bits = bits; + } + + @Override + public ArrayList getNets() { + return null; + } + + public void print(int tabs) { + System.out.println(JsonFile.tabs(tabs) + "direction: " + direction); + System.out.println(JsonFile.tabs(tabs) + "bits:"); + for(int i : bits){ + System.out.println(JsonFile.tabs(tabs + 1) + i); + + } + + } + +} diff --git a/src/main/java/GraphBuilder/json_representations/JsonFile.java b/src/main/java/GraphBuilder/json_representations/JsonFile.java new file mode 100644 index 0000000..665b381 --- /dev/null +++ b/src/main/java/GraphBuilder/json_representations/JsonFile.java @@ -0,0 +1,32 @@ +package GraphBuilder.json_representations; + +import java.util.HashMap; + +/** + * Created by Francis O'Brien - 4/3/2017 - 19:41 + */ + +public class JsonFile { + + public HashMap modules; + + public void print(){ + for (Module m : modules.values()){ + m.print(); + } + } + + public static String tabs(int tabs) { + String str = ""; + for (int i = 0; i < tabs; i++){ + str += "\t"; + } + return str; + } + + public void postInit(){ + for (Module m : modules.values()){ + m.postInit(); + } + } +} diff --git a/src/main/java/GraphBuilder/json_representations/JsonParseTest.java b/src/main/java/GraphBuilder/json_representations/JsonParseTest.java new file mode 100644 index 0000000..4b8f531 --- /dev/null +++ b/src/main/java/GraphBuilder/json_representations/JsonParseTest.java @@ -0,0 +1,24 @@ +package GraphBuilder.json_representations; + +/** + * Created by Francis O'Brien - 4/3/2017 - 19:48 + */ + +public class JsonParseTest { + + public static void main(String[] args) { +// try { +// +// Gson gson = new Gson(); +// JsonReader reader = new JsonReader(new FileReader("./run/verilog_designs/adder.json")); +// JsonFile jf = gson.fromJson(reader, JsonFile.class); +// jf.postInit(); +// jf.print(); +// +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// } + GraphBuilder.GraphBuilder.buildGraph("./run/verilog_designs/test.json").print(); + } + +} diff --git a/src/main/java/GraphBuilder/json_representations/Module.java b/src/main/java/GraphBuilder/json_representations/Module.java new file mode 100644 index 0000000..457c1b4 --- /dev/null +++ b/src/main/java/GraphBuilder/json_representations/Module.java @@ -0,0 +1,31 @@ +package GraphBuilder.json_representations; + +import java.util.HashMap; + +/** + * Created by Francis O'Brien - 4/3/2017 - 19:47 + */ + +public class Module { + + public HashMap ports; + public HashMap cells; + + public void print() { + System.out.println("PORTS:"); + for (String p : ports.keySet()){ + System.out.println("\t" + p); + ports.get(p).print(2); + } + + System.out.println("Cells:"); + for (String c : cells.keySet()){ + System.out.println("\t" + c); + cells.get(c).print(2); + } + } + + public void postInit(){ + for (JCell c : cells.values()) c.posInit(); + } +} diff --git a/src/main/java/GraphBuilder/json_representations/Node.java b/src/main/java/GraphBuilder/json_representations/Node.java new file mode 100644 index 0000000..3455457 --- /dev/null +++ b/src/main/java/GraphBuilder/json_representations/Node.java @@ -0,0 +1,14 @@ +package GraphBuilder.json_representations; + +import java.util.ArrayList; + +/** + * Created by Francis O'Brien - 4/3/2017 - 19:39 + */ + +abstract public class Node { + + abstract public ArrayList getNets(); + + +} diff --git a/src/main/java/MinecraftGraph/Function.java b/src/main/java/MinecraftGraph/Function.java new file mode 100644 index 0000000..d1558b8 --- /dev/null +++ b/src/main/java/MinecraftGraph/Function.java @@ -0,0 +1,42 @@ +package MinecraftGraph; + +public class Function extends Vertex { + public FunctionType func_type; + protected int id; + + public Function(int i, FunctionType f_t, int x){ + + super.type=VertexType.FUNCTION; + super.bits_n=x; + id=i; + this.func_type=f_t; + } + + + public FunctionType getFunc_Type(){ + return this.func_type; + + } + + + + @Override + public void addToNext(Vertex v){ + super.addToNext(v); + } + + @Override + public void addToBefore(Vertex v){ + super.addToBefore(v); + } + + @Override + public String getID(){ + return String.valueOf(id); + + } + + public int get_num_inputs() { + return this.bits_n; + } +} diff --git a/src/main/java/MinecraftGraph/FunctionType.java b/src/main/java/MinecraftGraph/FunctionType.java new file mode 100644 index 0000000..40bcd60 --- /dev/null +++ b/src/main/java/MinecraftGraph/FunctionType.java @@ -0,0 +1,5 @@ +package MinecraftGraph; + +public enum FunctionType { + OR,XOR, AND, INV, MUX, RELAY, IO, HIGH, LOW, D_LATCH; +} diff --git a/src/main/java/MinecraftGraph/Graph.java b/src/main/java/MinecraftGraph/Graph.java new file mode 100644 index 0000000..c50599a --- /dev/null +++ b/src/main/java/MinecraftGraph/Graph.java @@ -0,0 +1,81 @@ +package MinecraftGraph; + +import java.util.ArrayList; + +public class Graph { + + //only input vertices + private ArrayList vertices; + + public Graph(){ + vertices=new ArrayList(); + } + + + public void addVertex(Vertex v){ + vertices.add(v); + } + + + public void addEdge(Vertex v1, Vertex v2){ + + if (v2.type == VertexType.FUNCTION){ + Function f = (Function) v2; + if (f.func_type == FunctionType.MUX){ + MuxVertex m = (MuxVertex) f; + + } + } + + v1.addToNext(v2); + v2.addToBefore(v1); + + + } + + + public void removeEdge(Vertex v1, Vertex v2){ + v1.removeNext(v2); + v2.removeBefore(v1); + } + + public void removeVertex(Vertex v){ + //remove v from all neighbors + + for(Vertex ver: vertices){ + ver.removeNext(v); + ver.removeBefore(v); + } + //remove v from vertices list + vertices.remove(v); + + } + + //This function takes the inputs to the first vertex v1 and adds them to v2 + public void mergeVertices(Vertex v1, Vertex v2){ + + + //v1 is to be merged(source) + for(Vertex v: v1.getBefore()){ + v2.addToBefore(v); + v.addToNext(v2); + } + + + + } + + public ArrayList getVertices(){ + + return vertices; + + } + + public void print(){ + System.out.println(this.vertices.size()); + + for (Vertex v : this.vertices){ + v.print(); + } + } +} diff --git a/src/main/java/MinecraftGraph/In_output.java b/src/main/java/MinecraftGraph/In_output.java new file mode 100644 index 0000000..c31c2bf --- /dev/null +++ b/src/main/java/MinecraftGraph/In_output.java @@ -0,0 +1,21 @@ +package MinecraftGraph; + +public class In_output extends Vertex{ + private String name; + + public In_output(int num, VertexType v_t, String n){ + + super.bits_n=num; + super.type=v_t; + this.name=n; + + } + + @Override + public String getID(){ + return name; + + } + + +} diff --git a/src/main/java/MinecraftGraph/MuxVertex.java b/src/main/java/MinecraftGraph/MuxVertex.java new file mode 100644 index 0000000..da96680 --- /dev/null +++ b/src/main/java/MinecraftGraph/MuxVertex.java @@ -0,0 +1,28 @@ +package MinecraftGraph; + +/** + * Created by Francis O'Brien - 4/4/2017 - 17:12 + */ + +public class MuxVertex extends Function { + + public Vertex s_vertex, a_vertex, b_vertex; + public int s_net_num, a_net_num, b_net_num = -1; //a (s = 0); b (s = 1) + + public MuxVertex(int i, FunctionType f_t, int x) { + super(i, f_t, x); + } + + @Override + public String getID() { + return String.valueOf(id); + } + + @Override + public void handleRelay(Vertex v, Vertex relay) { + super.handleRelay(v, relay); + if (v == a_vertex) this.a_vertex = relay; + else if (v == b_vertex) this.b_vertex = relay; + else if (v == s_vertex) this.s_vertex = relay; + } +} diff --git a/src/main/java/MinecraftGraph/Vertex.java b/src/main/java/MinecraftGraph/Vertex.java new file mode 100644 index 0000000..6351dc6 --- /dev/null +++ b/src/main/java/MinecraftGraph/Vertex.java @@ -0,0 +1,77 @@ +package MinecraftGraph; + +import java.util.ArrayList; + +public abstract class Vertex { + + public VertexType type; + protected int bits_n; + private int counter=0; + private ArrayList next=new ArrayList(); + private ArrayList before=new ArrayList(); + + + + + public VertexType getType(){ + return this.type; + } + + public boolean canAdd(){ + if(bits_n==counter){ + return false; + } + else{ + return true; + } + } + + + public abstract String getID(); + + + + public void addToNext(Vertex v){ + counter++; + this.next.add(v); + } + public ArrayList getNext(){ + return this.next; + } + + public void removeNext(Vertex v){ + next.remove(v); + } + + public void addToBefore(Vertex v){ + this.before.add(v); + } + public ArrayList getBefore(){ + return this.before; + } + + public void removeBefore(Vertex v){ + before.remove(v); + } + + + public void print(){ + if (this.type == VertexType.FUNCTION){ + System.out.println(((Function) this).func_type); + } else { + System.out.println(this.type); + } + + for (Vertex v : this.next){ + if (v.type == VertexType.FUNCTION){ + System.out.println("\t:" + ((Function) v).func_type); + } else { + System.out.println("\t" + v.type); + } + } + }; + + public void handleRelay(Vertex v, Vertex relay) { + + } +} diff --git a/src/main/java/MinecraftGraph/VertexType.java b/src/main/java/MinecraftGraph/VertexType.java new file mode 100644 index 0000000..8e56a0d --- /dev/null +++ b/src/main/java/MinecraftGraph/VertexType.java @@ -0,0 +1,5 @@ +package MinecraftGraph; + +public enum VertexType { + INPUT, OUTPUT, FUNCTION; +} diff --git a/src/main/java/minecrafthdl/ClientProxy.java b/src/main/java/minecrafthdl/ClientProxy.java new file mode 100644 index 0000000..e56275b --- /dev/null +++ b/src/main/java/minecrafthdl/ClientProxy.java @@ -0,0 +1,29 @@ +package minecrafthdl; + +import minecrafthdl.client.render.blocks.BlockRenderRegister; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; + +/** + * Created by Francis on 10/5/2016. + */ +public class ClientProxy extends CommonProxy { + + @Override + public void preInit(FMLPreInitializationEvent e) { + super.preInit(e); + } + + @Override + public void init(FMLInitializationEvent e) { + super.init(e); + BlockRenderRegister.registerBlockRenderer(); + } + + @Override + public void postInit(FMLPostInitializationEvent e) { + super.postInit(e); + } + +} diff --git a/src/main/java/minecrafthdl/CommonProxy.java b/src/main/java/minecrafthdl/CommonProxy.java new file mode 100644 index 0000000..f20f0ab --- /dev/null +++ b/src/main/java/minecrafthdl/CommonProxy.java @@ -0,0 +1,26 @@ +package minecrafthdl; + +import minecrafthdl.block.ModBlocks; +import minecrafthdl.gui.MinecraftHDLGuiHandler; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.network.NetworkRegistry; + +/** + * Created by Francis on 10/5/2016. + */ +public class CommonProxy { + + public void preInit(FMLPreInitializationEvent e) { + ModBlocks.createBlocks(); + } + + public void init(FMLInitializationEvent e) { + NetworkRegistry.INSTANCE.registerGuiHandler(MinecraftHDL.instance, new MinecraftHDLGuiHandler()); + } + + public void postInit(FMLPostInitializationEvent e) { + + } +} diff --git a/src/main/java/minecrafthdl/Demo.java b/src/main/java/minecrafthdl/Demo.java new file mode 100644 index 0000000..b9026bc --- /dev/null +++ b/src/main/java/minecrafthdl/Demo.java @@ -0,0 +1,82 @@ +package minecrafthdl; + +import MinecraftGraph.*; + +/** + * Created by Francis on 11/27/2016. + */ +public class Demo { + + public static Graph create4bitmuxgraph(){ + Graph mux = new Graph(); + + + + Vertex i = new In_output(1, VertexType.INPUT, "i"); + Vertex j = new In_output(1, VertexType.INPUT, "j"); + + mux.addVertex(i); + mux.addVertex(j); + + Vertex not_1 = new Function(1, FunctionType.INV, 1); + Vertex not_2 = new Function(1, FunctionType.INV, 1); + + mux.addVertex(not_1); + mux.addVertex(not_2); + + Vertex a = new In_output(1, VertexType.INPUT, "a"); + Vertex b = new In_output(1, VertexType.INPUT, "b"); + Vertex c = new In_output(1, VertexType.INPUT, "c"); + Vertex d = new In_output(1, VertexType.INPUT, "d"); + + mux.addVertex(a); + mux.addVertex(b); + mux.addVertex(c); + mux.addVertex(d); + + Vertex and_1 = new Function(1, FunctionType.AND, 3); + Vertex and_2 = new Function(1, FunctionType.AND, 3); + Vertex and_3 = new Function(1, FunctionType.AND, 3); + Vertex and_4 = new Function(1, FunctionType.AND, 3); + Vertex or_1 = new Function(1, FunctionType.OR, 4); + + mux.addVertex(and_1); + mux.addVertex(and_2); + mux.addVertex(and_3); + mux.addVertex(and_4); + mux.addVertex(or_1); + + Vertex o = new In_output(1, VertexType.OUTPUT, "o"); + + mux.addVertex(o); + + + mux.addEdge(i, not_1); + mux.addEdge(j, not_2); + + mux.addEdge(i, and_2); + mux.addEdge(i, and_4); + mux.addEdge(not_1, and_1); + mux.addEdge(not_1, and_3); + + mux.addEdge(j, and_3); + mux.addEdge(j, and_4); + mux.addEdge(not_2, and_1); + mux.addEdge(not_2, and_2); + + mux.addEdge(a, and_1); + mux.addEdge(b, and_2); + mux.addEdge(c, and_3); + mux.addEdge(d, and_4); + + mux.addEdge(and_1, or_1); + mux.addEdge(and_2, or_1); + mux.addEdge(and_3, or_1); + mux.addEdge(and_4, or_1); + + mux.addEdge(or_1, o); + + return mux; + } + +} diff --git a/src/main/java/minecrafthdl/MHDLException.java b/src/main/java/minecrafthdl/MHDLException.java new file mode 100644 index 0000000..d64e370 --- /dev/null +++ b/src/main/java/minecrafthdl/MHDLException.java @@ -0,0 +1,9 @@ +package minecrafthdl; + +public class MHDLException extends RuntimeException { + + public MHDLException(String message){ + super(message); + } + +} diff --git a/src/main/java/minecrafthdl/MinecraftHDL.java b/src/main/java/minecrafthdl/MinecraftHDL.java new file mode 100644 index 0000000..0c745b4 --- /dev/null +++ b/src/main/java/minecrafthdl/MinecraftHDL.java @@ -0,0 +1,52 @@ +package minecrafthdl; + +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventHandler; +import net.minecraftforge.fml.common.SidedProxy; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; +import net.minecraftforge.fml.common.registry.GameRegistry; + +@Mod(modid = MinecraftHDL.MODID, name = MinecraftHDL.MODNAME, version = MinecraftHDL.VERSION) +public class MinecraftHDL +{ + public static final String MODID = "minecrafthdl"; + public static final String MODNAME = "Minecraft HDL"; + public static final String VERSION = "1.0"; + + @SidedProxy(clientSide="minecrafthdl.ClientProxy", serverSide="minecrafthdl.ServerProxy") + public static CommonProxy proxy; + + @Mod.Instance + public static MinecraftHDL instance = new MinecraftHDL(); + + @EventHandler + public void preInit(FMLPreInitializationEvent e) { + proxy.preInit(e); + } + + @EventHandler + public void init(FMLInitializationEvent e) + { + proxy.init(e); + // some example code + MinecraftForge.EVENT_BUS.register(this); + + } + + @EventHandler + public void postInit(FMLPostInitializationEvent e) { + proxy.postInit(e); + } + +// @SubscribeEvent +// public void onPlayerTick(TickEvent.PlayerTickEvent tick) +// { +// FMLLog.getLogger().log(Level.INFO, "Player Tick"); +// } +} diff --git a/src/main/java/minecrafthdl/ServerProxy.java b/src/main/java/minecrafthdl/ServerProxy.java new file mode 100644 index 0000000..83dae9d --- /dev/null +++ b/src/main/java/minecrafthdl/ServerProxy.java @@ -0,0 +1,27 @@ +package minecrafthdl; + +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; +import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; + +/** + * Created by Francis on 10/5/2016. + */ +public class ServerProxy extends CommonProxy { + + @Override + public void preInit(FMLPreInitializationEvent e) { + super.preInit(e); + } + + @Override + public void init(FMLInitializationEvent e) { + super.init(e); + } + + @Override + public void postInit(FMLPostInitializationEvent e) { + super.postInit(e); + } + +} diff --git a/src/main/java/minecrafthdl/Utils.java b/src/main/java/minecrafthdl/Utils.java new file mode 100644 index 0000000..3aa14b8 --- /dev/null +++ b/src/main/java/minecrafthdl/Utils.java @@ -0,0 +1,41 @@ +package minecrafthdl; + +import minecrafthdl.synthesis.CircuitTest; +import net.minecraft.block.Block; +import net.minecraft.block.properties.IProperty; + +/** + * Created by Francis on 10/28/2016. + */ +public class Utils { + + public static IProperty getPropertyByName(Block block, String name){ + for (IProperty prop : block.getBlockState().getProperties()){ + if (prop.getName().equals(name)){ + return prop; + } + } + return null; + } + + public static void printProperties(Block block){ + for (IProperty prop : block.getBlockState().getProperties()){ + System.out.println(prop.getName()); + System.out.println(prop.getAllowedValues()); + + } + } + + public static void printCircuit(CircuitTest circuit){ + for (int y = 0; y < circuit.getSizeY(); y++) { + for (int x = 0; x < circuit.getSizeX(); x++) { + for (int z = 0; z < circuit.getSizeZ(); z++) { + System.out.print(circuit.getState(x, y, z)); + } + System.out.print("\n"); + } + System.out.print("\n\n"); + } + } + +} diff --git a/src/main/java/minecrafthdl/block/BasicBlock.java b/src/main/java/minecrafthdl/block/BasicBlock.java new file mode 100644 index 0000000..ad584f1 --- /dev/null +++ b/src/main/java/minecrafthdl/block/BasicBlock.java @@ -0,0 +1,28 @@ +package minecrafthdl.block; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; + +/** + * Created by Francis on 10/5/2016. + */ +public class BasicBlock extends Block { + + public BasicBlock(String unlocalizedName, Material material, float hardness, float resistance) { + super(material); + this.setUnlocalizedName(unlocalizedName); + this.setCreativeTab(CreativeTabs.MISC); + this.setHardness(hardness); + this.setResistance(resistance); + } + + public BasicBlock(String unlocalizedName, float hardness, float resistance) { + this(unlocalizedName, Material.ROCK, hardness, resistance); + } + + public BasicBlock(String unlocalizedName) { + this(unlocalizedName, 2.0f, 10.0f); + } + +} diff --git a/src/main/java/minecrafthdl/block/ModBlocks.java b/src/main/java/minecrafthdl/block/ModBlocks.java new file mode 100644 index 0000000..d563d82 --- /dev/null +++ b/src/main/java/minecrafthdl/block/ModBlocks.java @@ -0,0 +1,17 @@ +package minecrafthdl.block; + +import minecrafthdl.block.blocks.Synthesizer; +import net.minecraft.block.Block; +import net.minecraftforge.fml.common.registry.GameRegistry; + +/** + * Created by Francis on 10/5/2016. + */ +public final class ModBlocks { + + public static Block tutorialBlock; + + public static void createBlocks() { + GameRegistry.registerBlock(tutorialBlock = new Synthesizer("tutorial_block"), "tutorial_block"); + } +} diff --git a/src/main/java/minecrafthdl/block/blocks/Synthesizer.java b/src/main/java/minecrafthdl/block/blocks/Synthesizer.java new file mode 100644 index 0000000..1b19836 --- /dev/null +++ b/src/main/java/minecrafthdl/block/blocks/Synthesizer.java @@ -0,0 +1,136 @@ +package minecrafthdl.block.blocks; + +import GraphBuilder.GraphBuilder; +import minecrafthdl.MHDLException; +import minecrafthdl.MinecraftHDL; +import minecrafthdl.block.BasicBlock; +import minecrafthdl.gui.MinecraftHDLGuiHandler; +import minecrafthdl.synthesis.Circuit; +import minecrafthdl.synthesis.IntermediateCircuit; +import minecrafthdl.synthesis.LogicGates; +import net.minecraft.block.Block; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import javax.annotation.Nullable; +import java.io.IOException; + +/** + * Created by Francis on 10/28/2016. + */ +public class Synthesizer extends BasicBlock { + + public static String file_to_gen; + + + public static final PropertyBool TRIGGERED = PropertyBool.create("triggered"); + + public Synthesizer(String unlocalizedName) { + super(unlocalizedName); + this.setDefaultState(this.blockState.getBaseState().withProperty(TRIGGERED, false)); + System.out.println("hello"); + } + + @Override + public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ){ + if (worldIn.isRemote){ + playerIn.openGui(MinecraftHDL.instance, MinecraftHDLGuiHandler.SYNTHESISER_GUI_ID, worldIn, (int) playerIn.posX, (int) playerIn.posY, (int) playerIn.posZ); + } + + return true; + } + + @SuppressWarnings("deprecation") + @Override + public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn) { + if(!worldIn.isRemote) { + if(!state.getValue(TRIGGERED)){ + if (worldIn.getRedstonePower(pos.north(), EnumFacing.NORTH) > 0) { + //Negative Z is receiving power + worldIn.setBlockState(pos, state.withProperty(TRIGGERED, true)); + + if (Synthesizer.file_to_gen != null){ + synth_gen(worldIn, pos); + + } + }else if (worldIn.getRedstonePower(pos.east(), EnumFacing.EAST) > 0) { + //Negative X is receiving power + worldIn.setBlockState(pos, state.withProperty(TRIGGERED, true)); + + if (Synthesizer.file_to_gen != null){ + synth_gen(worldIn, pos); + + } + + }else if (worldIn.getRedstonePower(pos.south(), EnumFacing.SOUTH) > 0) { + //Positive Z is receiving power + worldIn.setBlockState(pos, state.withProperty(TRIGGERED, true)); + + if (Synthesizer.file_to_gen != null){ + synth_gen(worldIn, pos); + + } + }else if (worldIn.getRedstonePower(pos.west(), EnumFacing.WEST) > 0) { + //Positive X is receiving power + worldIn.setBlockState(pos, state.withProperty(TRIGGERED, true)); + + if (Synthesizer.file_to_gen != null){ + synth_gen(worldIn, pos); + } + }else if (worldIn.getRedstonePower(pos.up(), EnumFacing.UP) > 0) { + //Positive Y is receiving power + worldIn.setBlockState(pos, state.withProperty(TRIGGERED, true)); + LogicGates.D_LATCH().placeInWorld(worldIn, pos, EnumFacing.NORTH); + }else if (worldIn.getRedstonePower(pos.down(), EnumFacing.DOWN) > 0) { + //Negative Y is receiving power + } else { + worldIn.setBlockState(pos, state.withProperty(TRIGGERED, false)); + } + } else { + if (!worldIn.isBlockPowered(pos)) { + worldIn.setBlockState(pos, state.withProperty(TRIGGERED, false)); + } + } + + worldIn.notifyNeighborsOfStateChange(pos, this); + } + } + + private void synth_gen(World worldIn, BlockPos pos){ + try { + + IntermediateCircuit ic = new IntermediateCircuit(); + ic.loadGraph(GraphBuilder.buildGraph(Synthesizer.file_to_gen)); + ic.buildGates(); + ic.routeChannels(); + ic.genCircuit().placeInWorld(worldIn, pos, EnumFacing.NORTH); + } catch (Exception e){ + Minecraft.getMinecraft().thePlayer.sendChatMessage("An error occurred while generating the circuit, check the logs! Sorry!"); + e.printStackTrace(); + } + } + + @Override + protected BlockStateContainer createBlockState() + { + return new BlockStateContainer(this, TRIGGERED); + } + + @Override + public IBlockState getStateFromMeta(int meta) { + return this.getDefaultState().withProperty(TRIGGERED, (meta) > 0); + } + + @Override + public int getMetaFromState(IBlockState state) { + return state.getValue(TRIGGERED) ? 1 : 0; + } +} diff --git a/src/main/java/minecrafthdl/client/render/blocks/BlockRenderRegister.java b/src/main/java/minecrafthdl/client/render/blocks/BlockRenderRegister.java new file mode 100644 index 0000000..6a0c43d --- /dev/null +++ b/src/main/java/minecrafthdl/client/render/blocks/BlockRenderRegister.java @@ -0,0 +1,22 @@ +package minecrafthdl.client.render.blocks; + +import minecrafthdl.MinecraftHDL; +import minecrafthdl.block.ModBlocks; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.Item; + +/** + * Created by Francis on 10/28/2016. + */ +public class BlockRenderRegister { + public static void registerBlockRenderer() { + reg(ModBlocks.tutorialBlock); + } + + public static void reg(Block block) { + Minecraft.getMinecraft().getRenderItem().getItemModelMesher() + .register(Item.getItemFromBlock(block), 0, new ModelResourceLocation(MinecraftHDL.MODID + ":" + block.getUnlocalizedName().substring(5), "inventory")); + } +} diff --git a/src/main/java/minecrafthdl/gui/MinecraftHDLGuiHandler.java b/src/main/java/minecrafthdl/gui/MinecraftHDLGuiHandler.java new file mode 100644 index 0000000..f269de8 --- /dev/null +++ b/src/main/java/minecrafthdl/gui/MinecraftHDLGuiHandler.java @@ -0,0 +1,26 @@ +package minecrafthdl.gui; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.IGuiHandler; + +/** + * Created by Francis on 3/25/2017. + */ +public class MinecraftHDLGuiHandler implements IGuiHandler { + + public static final int SYNTHESISER_GUI_ID = 0; + + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + return null; + } + + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + if (ID == SYNTHESISER_GUI_ID) + return new SynthesiserGUI(world, x, y, z); + return null; + } + +} diff --git a/src/main/java/minecrafthdl/gui/SynthesiserGUI.java b/src/main/java/minecrafthdl/gui/SynthesiserGUI.java new file mode 100644 index 0000000..e7e60ba --- /dev/null +++ b/src/main/java/minecrafthdl/gui/SynthesiserGUI.java @@ -0,0 +1,233 @@ +package minecrafthdl.gui; + +import minecrafthdl.block.blocks.Synthesizer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +/** + * Created by Francis on 3/25/2017. + */ +public class SynthesiserGUI extends GuiScreen { + + GuiButton synthesize_button, up_button, down_button; + int synth_b_id = 0; + int up_b_id = 1; + int down_b_id = 2; + + String file_directory = "./verilog_designs"; + + ArrayList file_names = new ArrayList(); + int selected_file = -1; + + + int window_width = 256; + int window_height = 256; + + int window_left, window_top, filebox_left, filebox_top, filebox_right, filebox_bottom; + + int line_height = 10; + int padding = 2; + int total_height = line_height + (2 * padding); + + int start_file_index = 0; + + int block_x, block_y, block_z; + World world; + + + public SynthesiserGUI(World world, int x, int y, int z) { + super(); + + this.world = world; + this.block_x = x; + this.block_y = y; + this.block_z = z; + } + + + @Override + public void initGui() { + + + this.window_left = centerObjectTL(this.window_width, this.width); + this.window_top = centerObjectTL(this.window_height, this.height); + + this.filebox_left = window_left + 12; + this.filebox_right = window_left + 150; + this.filebox_top = window_top + 25; + this.filebox_bottom = window_top + 130; + + this.buttonList.add(this.synthesize_button = new GuiButton(this.synth_b_id, this.width / 2 - 50, this.height / 2 + 52, 100, 20, "Generate Design")); + this.buttonList.add(this.up_button = new GuiButton(this.up_b_id , this.filebox_right + 1, this.filebox_top - 1, 20, 20, "^")); + this.buttonList.add(this.down_button = new GuiButton(this.down_b_id, this.filebox_right + 1, this.filebox_bottom - 19, 20, 20, "/")); + + + System.out.println("Win L: " + this.window_left + "\tWin T: " + this.window_top); + + this.synthesize_button.enabled = false; + this.file_names = this.readFileNames(); + } + + private ArrayList readFileNames(){ + ArrayList files = new ArrayList(); + File folder = new File(file_directory); + + if (folder == null) { + folder.mkdir(); + } + + System.out.println("PWD: " + System.getProperty("user.dir")); + + + if (!folder.exists()) { + folder.mkdir(); + Minecraft.getMinecraft().thePlayer.sendChatMessage("Created folder 'verilog_designs'"); + Minecraft.getMinecraft().thePlayer.sendChatMessage("Copy your synthesized JSON files to this directory:"); + Minecraft.getMinecraft().thePlayer.sendChatMessage(System.getProperty("user.dir") + "\\verilog_designs"); + + } else { + for (File f : folder.listFiles()){ + if (f.getName().toLowerCase().endsWith(".json")) { + files.add(f.getName()); + } + } + } + + + + + return files; + } + + private int centerObjectTL(int obj_dimension, int scrn_dimension){ + return (scrn_dimension / 2) - (obj_dimension / 3); + } + + private int centerObjectBR(int obj_dimension, int scrn_dimension){ + return (scrn_dimension / 2) + (obj_dimension / 2); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + this.mc.getTextureManager().bindTexture(new ResourceLocation("minecrafthdl:textures/gui/synthesiser.png")); + this.drawTexturedModalRect(centerObjectTL(this.window_width, this.width), centerObjectTL(this.window_height, this.height), 0, 0, this.window_width, this.window_height); + + this.fontRendererObj.drawString( + "Synthesiser", + (this.width / 2) - (this.fontRendererObj.getStringWidth("Synthesiser") / 2), + (this.height / 2) - 75, + 0 + ); + + this.drawFileNames(); + + super.drawScreen(mouseX, mouseY, partialTicks); + } + + private void drawFileNames(){ + int current_height = this.filebox_top; + int files_shown = 0; + for (int i = this.start_file_index; i < this.file_names.size(); i++) { + if (files_shown == 7) break; + else files_shown++; + String file_name = this.file_names.get(i); + int max_width = this.filebox_right - this.filebox_left - (2 * this.padding); + if (this.fontRendererObj.getStringWidth(file_name) > max_width) { + file_name = this.fontRendererObj.trimStringToWidth(file_name, max_width - this.fontRendererObj.getStringWidth("...")) + "..."; + } + + if (this.selected_file == i){ + + this.drawGradientRect( + this.filebox_left, + current_height, + this.filebox_right, + current_height + this.total_height, + 0xFFFFFFFF, 0xFFFFFFFF + ); + + current_height += this.padding; + + this.fontRendererObj.drawString( + file_name, + this.filebox_left + this.padding, + current_height, + 0x00000000 + ); + + current_height += this.line_height + this.padding; + + } else { + current_height += this.padding; + + this.fontRendererObj.drawString( + file_name, + this.filebox_left + this.padding, + current_height, + 0xFFFFFFFF + ); + + current_height += this.line_height + this.padding; + } + } + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException{ + if(mouseX >= this.filebox_left && mouseX <= this.filebox_right && mouseY >= this.filebox_top && mouseY <= this.filebox_bottom) { + int index = (mouseY - this.filebox_top + (this.start_file_index * this.line_height)) / this.total_height; + if (index < this.file_names.size()){ + this.selected_file = index; + this.synthesize_button.enabled = true; + } else { + this.selected_file = -1; + this.synthesize_button.enabled = false; + } + } + super.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + protected void actionPerformed(GuiButton button) throws IOException { + System.out.println("Hi"); + if (button == this.synthesize_button) { + if (this.selected_file < 0) { + this.mc.displayGuiScreen(null); + if (this.mc.currentScreen == null) + this.mc.setIngameFocus(); + } + + Synthesizer.file_to_gen = this.file_directory + "/" + this.file_names.get(this.selected_file); + + this.mc.displayGuiScreen(null); + if (this.mc.currentScreen == null) + this.mc.setIngameFocus(); + } + if (button == this.up_button){ + if (this.start_file_index > 0) this.start_file_index-= 1; + } + if (button == this.down_button){ + if (this.start_file_index + 6 < this.file_names.size() - 1) this.start_file_index += 1; + } + + + + super.actionPerformed(button); + } + + @Override + public boolean doesGuiPauseGame() { + return false; + } + + +} diff --git a/src/main/java/minecrafthdl/synthesis/Circuit.java b/src/main/java/minecrafthdl/synthesis/Circuit.java new file mode 100644 index 0000000..d49bf2c --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/Circuit.java @@ -0,0 +1,115 @@ +package minecrafthdl.synthesis; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3i; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * Created by Francis on 10/28/2016. + */ +public class Circuit { + + public static boolean TEST = false; + + ArrayList>> blocks; + + public Circuit(int sizeX, int sizeY, int sizeZ){ + this.blocks = new ArrayList>>(); + for (int x = 0; x < sizeX; x++) { + this.blocks.add(new ArrayList>()); + for (int y = 0; y < sizeY; y++) { + this.blocks.get(x).add(new ArrayList()); + for (int z = 0; z < sizeZ; z++) { + if (!Circuit.TEST) this.blocks.get(x).get(y).add(Blocks.AIR.getDefaultState()); + } + } + } + } + + + + public void setBlock(int x, int y, int z, IBlockState blockstate) { + if (TEST) return; + this.blocks.get(x).get(y).set(z, blockstate); + } + + public void placeInWorld(World worldIn, BlockPos pos, EnumFacing direction) { + int width = blocks.size(); + int height = blocks.get(0).size(); + int length = blocks.get(0).get(0).size(); + + int start_x = pos.getX(); + int start_y = pos.getY(); + int start_z = pos.getZ(); + + if (direction == EnumFacing.NORTH){ + start_z += 2; + } else if (direction == EnumFacing.SOUTH) { + start_z -= length + 1; + } else if (direction == EnumFacing.EAST){ + start_x -= width + 1; + } else if (direction == EnumFacing.WEST) { + start_x -= width + 1; + } + + int y = start_y - 1; + for (int x = start_x - 1; x < start_x + width + 1; x++){ + for (int z = start_z - 1; z < start_z + length + 1; z ++){ + worldIn.setBlockState(new BlockPos(x, y, z), Blocks.STONEBRICK.getDefaultState()); + } + } + + HashMap torches = new HashMap(); + + for (int i = 0; i < width; i++){ + for (int j = 0; j < height; j++) { + for (int k = 0; k < length; k++) { + if (this.getState(i, j, k).getBlock().getDefaultState() == Blocks.REDSTONE_TORCH.getDefaultState()) { + torches.put(new Vec3i(i, j, k), this.getState(i, j, k)); + } else { + worldIn.setBlockState(new BlockPos(start_x + i, start_y + j, start_z + k), this.getState(i, j, k)); + } + } + } + } + + for (Map.Entry set : torches.entrySet()){ + worldIn.setBlockState(new BlockPos(start_x + set.getKey().getX(), start_y + set.getKey().getY(), start_z + set.getKey().getZ()), set.getValue()); + } + } + + public int getSizeX() { + return this.blocks.size(); + } + + public int getSizeY() { + return this.blocks.get(0).size(); + } + + public int getSizeZ() { + return this.blocks.get(0).get(0).size(); + } + + public IBlockState getState(int x, int y, int z){ + return this.blocks.get(x).get(y).get(z); + } + + public void insertCircuit(int x_offset, int y_offset, int z_offset, Circuit c) { + for (int x = 0; x < c.getSizeX(); x++) { + for (int y = 0; y < c.getSizeY(); y++) { + for (int z = 0; z < c.getSizeZ(); z++) { + this.setBlock(x + x_offset, y + y_offset, z + z_offset, c.getState(x, y, z)); + } + } + } + } +} diff --git a/src/main/java/minecrafthdl/synthesis/CircuitTest.java b/src/main/java/minecrafthdl/synthesis/CircuitTest.java new file mode 100644 index 0000000..70a9991 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/CircuitTest.java @@ -0,0 +1,49 @@ +package minecrafthdl.synthesis; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.ArrayList; + +/** + * Created by Francis on 10/28/2016. + */ +public class CircuitTest { + ArrayList>> blocks; + + public CircuitTest(int sizeX, int sizeY, int sizeZ){ + this.blocks = new ArrayList>>(); + for (int x = 0; x < sizeX; x++) { + this.blocks.add(new ArrayList>()); + for (int y = 0; y < sizeY; y++) { + this.blocks.get(x).add(new ArrayList()); + for (int z = 0; z < sizeZ; z++) { + this.blocks.get(x).get(y).add("."); + } + } + } + } + + public void setBlock(int x, int y, int z, String blockstate) { + this.blocks.get(x).get(y).set(z, blockstate); + } + + public int getSizeX() { + return this.blocks.size(); + } + + public int getSizeY() { + return this.blocks.get(0).size(); + } + + public int getSizeZ() { + return this.blocks.get(0).get(0).size(); + } + + public String getState(int x, int y, int z){ + return this.blocks.get(x).get(y).get(z); + } +} diff --git a/src/main/java/minecrafthdl/synthesis/Gate.java b/src/main/java/minecrafthdl/synthesis/Gate.java new file mode 100644 index 0000000..c2f985b --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/Gate.java @@ -0,0 +1,20 @@ +package minecrafthdl.synthesis; + +/** + * Created by Francis O'Brien - 3/3/2017 - 9:47 AM + */ + +public class Gate extends Circuit { + + public int num_inputs, num_outputs, input_spacing, output_spacing = 0; + public int[] output_lines; + public Gate(int sizeX, int sizeY, int sizeZ, int num_inputs, int num_outputs, int input_spacing, int output_spacing, int[] output_lines) { + super(sizeX, sizeY, sizeZ); + + this.num_inputs = num_inputs; + this.num_outputs = num_outputs; + this.input_spacing = input_spacing; + this.output_spacing = output_spacing; + this.output_lines = output_lines; + } +} diff --git a/src/main/java/minecrafthdl/synthesis/IntermediateCircuit.java b/src/main/java/minecrafthdl/synthesis/IntermediateCircuit.java new file mode 100644 index 0000000..d99aae7 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/IntermediateCircuit.java @@ -0,0 +1,267 @@ +package minecrafthdl.synthesis; + +import MinecraftGraph.*; +import minecrafthdl.MHDLException; +import minecrafthdl.synthesis.routing.Channel; +import minecrafthdl.synthesis.routing.Net; +import minecrafthdl.synthesis.routing.Router; +import minecrafthdl.synthesis.routing.pins.GatePins; +import minecrafthdl.synthesis.routing.pins.PinsArray; +import minecrafthdl.testing.TestLogicGates; +import net.minecraft.init.Blocks; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Created by Francis on 11/28/2016. + */ +public class IntermediateCircuit { + + public ArrayList> vertex_layers = new ArrayList>(); + public ArrayList> gate_layers = new ArrayList>(); + public ArrayList channels = new ArrayList(); + + + public void loadGraph(Graph graph) { + System.out.println("Graph built"); + + ArrayList finished = new ArrayList(); + ArrayList in_process = new ArrayList(); + ArrayList process_done = new ArrayList(); + ArrayList to_process = new ArrayList(); + + for (Vertex v : graph.getVertices()) { + if (v.getType() == VertexType.INPUT) { + in_process.add(v); + } else if (v.getType() == VertexType.FUNCTION){ + Function f = (Function) v; + if (f.func_type == FunctionType.HIGH || f.func_type == FunctionType.LOW) in_process.add(v); + } + + } + + int layer_num = 0; + + while (in_process.size() > 0){ + int size = in_process.size(); + vertex_layers.add(new ArrayList()); + for (Vertex v : in_process){ + boolean valid = true; + for (Vertex p : v.getBefore()){ + if (!finished.contains(p)) { + valid = false; + break; + } + } + + if (valid){ + vertex_layers.get(layer_num).add(v); + process_done.add(v); + + for (Vertex n : v.getNext()){ + to_process.add(n); + } + } + } + for (Vertex v : process_done){ + in_process.remove(v); + finished.add(v); + } + for (Vertex v : to_process){ + if (!in_process.contains(v)) in_process.add(v); + } + process_done.clear(); + to_process.clear(); + layer_num++; + +// if (size == in_process.size()){ +// System.out.println(""); +// throw new MHDLException("INFINITE LOOP"); +// } + } + + for (int i = 0; i < vertex_layers.size() - 1; i++){ + ArrayList layer = vertex_layers.get(i); + ArrayList next_layer = vertex_layers.get(i+1); + + for (Vertex v : layer){ + ArrayList addToNext = new ArrayList(); + ArrayList removeFromNext = new ArrayList(); + + for (Vertex next : v.getNext()){ + if (!next_layer.contains(next)){ + Vertex relay = new Function(1, FunctionType.RELAY, 1); + + next_layer.add(relay); + + removeFromNext.add(next); + next.removeBefore(v); + + addToNext.add(relay); + relay.addToBefore(v); + + relay.addToNext(next); + next.addToBefore(relay); + + next.handleRelay(v, relay); + } + } + + for (Vertex x : addToNext){ + v.addToNext(x); + } + + for (Vertex x : removeFromNext){ + v.removeNext(x); + } + } + } + + } + + public void printLayers(){ + for (ArrayList layer : vertex_layers){ + for (Vertex v : layer) { + if (v.getType() == VertexType.INPUT){ + System.out.print("I, "); + } + if (v.getType() == VertexType.FUNCTION){ + System.out.print(((Function) v).getFunc_Type() + ", "); + } + if (v.getType() == VertexType.OUTPUT){ + System.out.print("O, "); + } + } + System.out.print("\n"); + } + } + + public void buildGates() { + if (this.vertex_layers.size() == 0) throw new MHDLException("Must load graph before building gates"); + + for (ArrayList v_layer : this.vertex_layers) { + ArrayList this_layer = new ArrayList(); + for (Vertex v : v_layer) { + if (v.getType() == VertexType.FUNCTION) { + this_layer.add(genGate(((Function) v).getFunc_Type(), ((Function) v).get_num_inputs())); + } else { + this_layer.add(genGate(FunctionType.IO, 1)); + } + } + this.gate_layers.add(this_layer); + } + } + + public void routeChannels() { + for (int i = 0; i < vertex_layers.size() - 1; i++){ + ArrayList top_vertices = vertex_layers.get(i); + ArrayList top_gates = gate_layers.get(i); + ArrayList bottom_vertices = vertex_layers.get(i+1); + ArrayList bottom_gates = gate_layers.get(i + 1); + + Router.PinInitRtn rtn = Router.initializePins(top_vertices, top_gates, bottom_vertices, bottom_gates, 1); + + HashMap pin_map = rtn.pin_map; + PinsArray pins_array = rtn.pins_array; + + HashMap nets = Router.initializeNets(top_vertices, bottom_vertices, pin_map); + + this.channels.add(Router.placeNets(nets, pins_array)); + + Net.num_nets = 0; + } + + + } + + public Circuit genCircuit(){ + if (this.gate_layers.size() == 0) throw new MHDLException("Must build gates before generating final circuit"); + + int size_x = 0; + int size_y = 0; + int size_z = 0; + + int[] layers_size_z = new int[this.gate_layers.size()]; + + for (ArrayList layer : this.gate_layers){ + int this_size_x = layer.size() == 0 ? 0 : layer.size() - 1; + int this_size_y = 0; + int this_size_z = 0; + + for (Circuit c : layer){ + this_size_x += c.getSizeX(); + if (c.getSizeY() > this_size_y) this_size_y = c.getSizeY(); + if (c.getSizeZ() > this_size_z) this_size_z = c.getSizeZ(); + } + + if (this_size_x > size_x) size_x = this_size_x; + if (this_size_y > size_y) size_y = this_size_y; + size_z += this_size_z; + + layers_size_z[this.gate_layers.indexOf(layer)] = this_size_z; + } + + if (size_y < 3) size_y = 3; + + for (Channel c : this.channels){ + if (c.sizeX() + 1 > size_x) size_x = c.sizeX() + 1; + size_z += c.sizeZ() + 1; + } + + Circuit circuit = new Circuit(size_x, size_y, size_z); + + int z_offset = 0; + for (int i = 0; i < this.gate_layers.size(); i++) { + int x_offset = 0; + for (Gate g : this.gate_layers.get(i)){ + circuit.insertCircuit(x_offset, 0, z_offset, g); + + if (g.getSizeZ() - 1 < layers_size_z[i]) { + for (int z = g.getSizeZ(); z <= layers_size_z[i]; z++){ + circuit.setBlock(x_offset, 0, z_offset + z, Blocks.REDSTONE_WIRE.getDefaultState()); + } + } + + x_offset += 1 + g.getSizeX(); + } + z_offset += layers_size_z[i]; + + if (i < this.gate_layers.size() - 1) { + Channel c = this.channels.get(i); + circuit.insertCircuit(0, 0, z_offset, c.genChannelCircuit()); + z_offset += c.sizeZ(); + } + } + + return circuit; + } + + + private static Gate genGate(FunctionType func_type, int num_inputs) { + if (func_type == FunctionType.AND) { + return Circuit.TEST? TestLogicGates.AND(num_inputs) : LogicGates.AND(num_inputs); + } else if ( func_type == FunctionType.OR){ + return Circuit.TEST? TestLogicGates.OR(num_inputs) : LogicGates.OR(num_inputs); + } else if ( func_type == FunctionType.INV){ + return Circuit.TEST? TestLogicGates.NOT() : LogicGates.NOT(); + } else if ( func_type == FunctionType.RELAY) { + return Circuit.TEST ? TestLogicGates.RELAY() : LogicGates.RELAY(); + }else if ( func_type == FunctionType.XOR){ + return Circuit.TEST? TestLogicGates.IO() : LogicGates.XOR(); + }else if ( func_type == FunctionType.MUX){ + return Circuit.TEST? TestLogicGates.IO() : LogicGates.MUX(); + }else if ( func_type == FunctionType.IO){ + return Circuit.TEST? TestLogicGates.IO() : LogicGates.IO(); + }else if ( func_type == FunctionType.HIGH){ + return Circuit.TEST? TestLogicGates.IO() : LogicGates.HIGH(); + }else if ( func_type == FunctionType.LOW){ + return Circuit.TEST? TestLogicGates.IO() : LogicGates.LOW(); + }else if ( func_type == FunctionType.D_LATCH){ + return Circuit.TEST? TestLogicGates.IO() : LogicGates.D_LATCH(); + } + else throw new MHDLException("NO SUCH GATE AVAILABLE"); + } + + +} diff --git a/src/main/java/minecrafthdl/synthesis/LogicGates.java b/src/main/java/minecrafthdl/synthesis/LogicGates.java new file mode 100644 index 0000000..d044b49 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/LogicGates.java @@ -0,0 +1,193 @@ +package minecrafthdl.synthesis; + +import minecrafthdl.Demo; +import minecrafthdl.MHDLException; +import minecrafthdl.Utils; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; + +/** + * Created by Francis on 11/12/2016. + */ +public class LogicGates { + + + public static void main(String[] args) { + IntermediateCircuit ic = new IntermediateCircuit(); + ic.loadGraph(Demo.create4bitmuxgraph()); + ic.printLayers(); + } + + public static Gate IO(){ + Gate gate = new Gate(1, 1, 1, 1, 1, 0, 0, new int[]{0}); + gate.setBlock(0, 0, 0, Blocks.WOOL.getDefaultState()); + return gate; + } + + public static Gate NOT(){ + Gate gate = new Gate(1, 1, 3, 1, 1, 0, 0, new int[]{0}); + gate.setBlock(0, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(0, 0, 1, Blocks.REDSTONE_TORCH.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_TORCH, "facing"), EnumFacing.SOUTH)); + gate.setBlock(0, 0, 2, Blocks.REDSTONE_WIRE.getDefaultState()); + return gate; + } + + public static Gate RELAY(){ + Gate gate = new Gate(1, 1, 3, 1, 1, 0, 0, new int[]{0}); + gate.setBlock(0, 0, 0, Blocks.REDSTONE_WIRE.getDefaultState()); + gate.setBlock(0, 0, 1, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + gate.setBlock(0, 0, 2, Blocks.REDSTONE_WIRE.getDefaultState()); + return gate; + } + + public static Gate AND(int inputs) { + if (inputs == 0) throw new MHDLException("Gate cannot have 0 inputs"); + int width; + if (inputs == 1) width = 1; + + else width = (inputs * 2) - 1; + + Gate gate = new Gate(width, 2, 4, inputs, 1, 1, 0, new int[]{0}); + + gate.setBlock(0, 0, 2, Blocks.REDSTONE_TORCH.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_TORCH, "facing"), EnumFacing.SOUTH)); + gate.setBlock(0, 0, 3, Blocks.REDSTONE_WIRE.getDefaultState()); + + for (int i = 0; i < width; i+=2) { + gate.setBlock(i, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(i, 0, 1, Blocks.WOOL.getDefaultState()); + gate.setBlock(i, 1, 0, Blocks.REDSTONE_TORCH.getDefaultState()); + gate.setBlock(i, 1, 1, Blocks.REDSTONE_WIRE.getDefaultState()); + + if (i != width - 1) { + gate.setBlock(i + 1, 0, 1, Blocks.WOOL.getDefaultState()); + if (i == 14) { + gate.setBlock(i + 1, 1, 1, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.EAST)); + } else { + gate.setBlock(i + 1, 1, 1, Blocks.REDSTONE_WIRE.getDefaultState()); + } + } + } + + return gate; + } + + + + public static Gate OR(int inputs) { + if (inputs == 0) throw new MHDLException("Gate cannot have 0 inputs"); + int width; + if (inputs == 1) width = 1; + else width = (inputs * 2) - 1; + + Gate gate = new Gate(width, 2, 4, inputs, 1, 1, 0, new int[]{0}); + + gate.setBlock(0, 0, 3, Blocks.REDSTONE_WIRE.getDefaultState()); + + for (int i = 0; i < width; i+=2) { + gate.setBlock(i, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(i, 0, 1, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + gate.setBlock(i, 0, 2, Blocks.REDSTONE_WIRE.getDefaultState()); + if (i != width - 1) { + if (i == 14) { + gate.setBlock(i + 1, 0, 2, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.EAST)); + } else { + gate.setBlock(i + 1, 0, 2, Blocks.REDSTONE_WIRE.getDefaultState()); + } + } + } + return gate; + } + + public static Gate XOR(){ + Gate gate = new Gate(3, 2, 6, 2, 1, 1, 0, new int[]{0}); + gate.setBlock(0, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(0, 0, 1, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + gate.setBlock(0, 0, 2, Blocks.REDSTONE_WIRE.getDefaultState()); + gate.setBlock(0, 0, 3, Blocks.WOOL.getDefaultState()); + gate.setBlock(0, 0, 4, Blocks.REDSTONE_WIRE.getDefaultState()); + + gate.setBlock(0, 1, 0, Blocks.STICKY_PISTON.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.STICKY_PISTON, "facing"), EnumFacing.SOUTH)); + gate.setBlock(0, 1, 1, Blocks.WOOL.getDefaultState()); + gate.setBlock(0, 1, 3, Blocks.REDSTONE_WIRE.getDefaultState()); + + + gate.setBlock(2, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(2, 0, 1, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + gate.setBlock(2, 0, 2, Blocks.REDSTONE_WIRE.getDefaultState()); + gate.setBlock(2, 0, 3, Blocks.WOOL.getDefaultState()); + gate.setBlock(2, 0, 4, Blocks.REDSTONE_WIRE.getDefaultState()); + + gate.setBlock(2, 1, 0, Blocks.STICKY_PISTON.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.STICKY_PISTON, "facing"), EnumFacing.SOUTH)); + gate.setBlock(2, 1, 1, Blocks.WOOL.getDefaultState()); + gate.setBlock(2, 1, 3, Blocks.REDSTONE_WIRE.getDefaultState()); + + gate.setBlock(1, 0, 4, Blocks.REDSTONE_WIRE.getDefaultState()); + gate.setBlock(1, 0, 2, Blocks.REDSTONE_WIRE.getDefaultState()); + gate.setBlock(0, 0, 5, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + + return gate; + } + + public static Gate MUX() { + Gate gate = new Gate(5, 2, 6, 3, 1, 1, 0, new int[]{0}); + + gate.setBlock(0, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(0, 0, 1, Blocks.WOOL.getDefaultState()); + gate.setBlock(0, 0, 2, Blocks.WOOL.getDefaultState()); + gate.setBlock(0, 0, 3, Blocks.REDSTONE_TORCH.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_TORCH, "facing"), EnumFacing.SOUTH)); + gate.setBlock(0, 0, 4, Blocks.REDSTONE_WIRE.getDefaultState()); + gate.setBlock(0, 0, 5, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + + gate.setBlock(1, 0, 2, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.EAST)); + gate.setBlock(1, 0, 4, Blocks.REDSTONE_WIRE.getDefaultState()); + + gate.setBlock(2, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(2, 0, 1, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + gate.setBlock(2, 0, 2, Blocks.WOOL.getDefaultState()); + gate.setBlock(2, 0, 4, Blocks.REDSTONE_WIRE.getDefaultState()); + + gate.setBlock(3, 0, 2, Blocks.REDSTONE_TORCH.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_TORCH, "facing"), EnumFacing.EAST)); + gate.setBlock(3, 0, 4, Blocks.REDSTONE_TORCH.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_TORCH, "facing"), EnumFacing.WEST)); + + gate.setBlock(4, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(4, 0, 1, Blocks.REDSTONE_TORCH.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_TORCH, "facing"), EnumFacing.SOUTH)); + gate.setBlock(4, 0, 2, Blocks.REDSTONE_WIRE.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_WIRE, "power"), 10)); + gate.setBlock(4, 0, 3, Blocks.REDSTONE_WIRE.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_WIRE, "power"), 10)); + gate.setBlock(4, 0, 4, Blocks.WOOL.getDefaultState()); + + gate.setBlock(0, 1, 0, Blocks.REDSTONE_TORCH.getDefaultState()); + gate.setBlock(0, 1, 1, Blocks.REDSTONE_WIRE.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_WIRE, "power"), 10)); + gate.setBlock(0, 1, 2, Blocks.REDSTONE_WIRE.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.REDSTONE_WIRE, "power"), 10)); + + return gate; + } + + public static Gate LOW(){ + Gate gate = new Gate(1, 1, 1, 1, 1, 0, 0, new int[]{0}); + gate.setBlock(0, 0, 0, Blocks.WOOL.getDefaultState()); + return gate; + } + + public static Gate HIGH(){ + Gate gate = new Gate(1, 1, 1, 1, 1, 0, 0, new int[]{0}); + gate.setBlock(0, 0, 0, Blocks.REDSTONE_TORCH.getDefaultState()); + return gate; + } + + public static Gate D_LATCH() { + Gate gate = new Gate(3, 1, 4, 2, 1, 1, 0, new int[]{0}); + + gate.setBlock(0, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(0, 0, 1, Blocks.REDSTONE_WIRE.getDefaultState()); + gate.setBlock(0, 0, 2, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + gate.setBlock(0, 0, 3, Blocks.WOOL.getDefaultState()); + + gate.setBlock(1, 0, 2, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.EAST)); + + gate.setBlock(2, 0, 0, Blocks.WOOL.getDefaultState()); + gate.setBlock(2, 0, 1, Blocks.REDSTONE_WIRE.getDefaultState()); + gate.setBlock(2, 0, 2, Blocks.REDSTONE_WIRE.getDefaultState()); + + return gate; + } +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/Channel.java b/src/main/java/minecrafthdl/synthesis/routing/Channel.java new file mode 100644 index 0000000..833756a --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/Channel.java @@ -0,0 +1,355 @@ +package minecrafthdl.synthesis.routing; + +import minecrafthdl.Utils; +import minecrafthdl.synthesis.Circuit; +import minecrafthdl.synthesis.routing.pins.Pin; +import minecrafthdl.synthesis.routing.pins.PinPair; +import minecrafthdl.synthesis.routing.pins.PinsArray; +import minecrafthdl.synthesis.routing.vcg.VerticalConstraintGraph; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; + +import java.util.ArrayList; + +/** + * Created by Francis O'Brien - 3/3/2017 - 8:37 AM + */ + +public class Channel { + public PinsArray pinsArray; + public ArrayList> tracks = new ArrayList>(); + + public void findAvailableTrack(Net net, VerticalConstraintGraph vcg){ + if (net == null){ + return; + } + int highest_track = 0; + try { + for (int vc_id : vcg.getEdgeIDList(net.id)){ + for (ArrayList track : this.tracks){ + for (Net n : track){ + if (n.id == vc_id && n.track >= highest_track) highest_track = n.track + 1; + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + + for(int i = highest_track; i < this.tracks.size(); i++){ + boolean hasConflict = false; + for (Net n : this.tracks.get(i)){ + hasConflict = n.hasHorizontalConflict(net); + if (hasConflict) break; + } + if (!hasConflict){ + this.tracks.get(i).add(net); + net.setTrack(i); + return; + } + } + ArrayList new_track = new ArrayList(); + new_track.add(net); + this.tracks.add(new_track); + net.setTrack(this.tracks.size() - 1); + } + + public Circuit genChannelCircuit(){ + int length = 2 + (3 * this.tracks.size()); + int height = 3; + int width = 0; + + for (ArrayList track : this.tracks){ + for (Net n : track){ + if (n.x_max > width) width = n.x_max; + } + } + + width += 1; + + Circuit circuit = new Circuit(width, height, length); + + ArrayList nets_done = new ArrayList(); + + for(ArrayList track : this.tracks){ + for (Net n : track){ + if (nets_done.contains(n)) continue; + this.placeTrack(circuit, n.track, n.x_min, n.x_max, n.getpins()); + nets_done.add(n); + + if (n.isOutpath()){ + circuit.setBlock(n.x_max, 0, n.trackZ() + 1, Blocks.WOOL.getDefaultState()); + circuit.setBlock(n.x_max, 1, n.trackZ() + 1, Blocks.REDSTONE_WIRE.getDefaultState()); + } + + if (n.out_partner != null && !n.isOutpath()){ + circuit.setBlock(n.x_max, 0, n.trackZ() - 1, Blocks.WOOL.getDefaultState()); + circuit.setBlock(n.x_max, 1, n.trackZ() - 1, Blocks.REDSTONE_WIRE.getDefaultState()); + } + + this.wireColumns(circuit, n); + this.repeatNets(circuit, n); + } + } + + + + return circuit; + } + + public void printChannel(){ + int width = pinsArray.getPairs().size(); + int height = tracks.size() + 2; + + String[][] chars = new String[width][height]; + + for (int x = 0; x < width; x++){ + for (int y = 0; y < height; y++){ + chars[x][y] = "."; + } + } + + for (int x = 0; x < width; x++){ + PinPair pair = pinsArray.getPair(x); + + chars[x][0] = Integer.toString(pair.top.netID()).charAt(0) + ""; + chars[x][height - 1] = Integer.toString(pair.bot.netID()).charAt(0) + ""; + if (pair.top.empty()) chars[x][0] = " "; + if (pair.bot.empty()) chars[x][height - 1] = " "; + } + + + for (ArrayList t : tracks){ + for (Net n: t){ + for (Pin p : n.getpins()){ + if (p.top) { + for(int i = 1; i <= n.track + 1; i++){ + chars[p.xPos()/2][i] = "│"; + } + } else { + for(int i = n.track + 1; i < height - 1; i++){ + chars[p.xPos()/2][i] = "│"; + } + } + } + } + } + + for (ArrayList t : tracks) { + for (Net n : t) { + if (n.isOutpath()){ + for (int y = n.track; y <= n.out_partner.track; y++){ + chars[n.x_max / 2][y + 1] = "|"; + } + } + } + } + + for (ArrayList t : tracks){ + for (Net n: t){ + for (int i = n.x_min/2; i <= n.x_max/2; i++){ + if(n.x_max == n.x_min) continue; + chars[i][n.track + 1] = "─"; + } + } + } + + + for (ArrayList t : tracks){ + for (Net n: t){ + + if(n.isOutpath()){ + chars[n.x_max / 2][n.track+1] = "┐"; + chars[n.x_max / 2][n.out_partner.track+1] = "┘"; + } + + for (Pin p : n.getpins()){ + int x = p.xPos() / 2; + + boolean up = false; + boolean down = false; + boolean left = n.x_min / 2 < x; + boolean right = n.x_max / 2 > x; + + if (p.top){ + up = true; + for (Pin p2 : n.getpins()){ + if (p2 != p && p.xPos() == p2.xPos()) down = true; + } + } else { + down = true; + for (Pin p2 : n.getpins()){ + if (p2 != p && p.xPos() == p2.xPos()) up = true; + } + } + + if (up){ + if (down){ + if (left){ + if (right) chars[x][n.track + 1] = "┼"; + else chars[x][n.track + 1] = "┤"; + } else { + if (right) chars[x][n.track + 1] = "├"; + //else chars[x][n.track + 1] = "│"; + } + } else { + if (left){ + if (right) chars[x][n.track + 1] = "┴"; + else chars[x][n.track + 1] = "┘"; + } else { + if (right) chars[x][n.track + 1] = "└"; + else chars[x][n.track + 1] = "?"; + } + } + } else { + if (down){ + if (left){ + if (right) chars[x][n.track + 1] = "┬"; + else chars[x][n.track + 1] = "┐"; + } else { + if (right) chars[x][n.track + 1] = "┌"; + else chars[x][n.track + 1] = "?"; + } + } else { + if (left){ + //if (right) chars[x][n.track + 1] = "─"; + //else chars[x][n.track + 1] = "?"; + } else { + if (right) chars[x][n.track + 1] = "?"; + else chars[x][n.track + 1] = "?"; + } + } + } + } + } + } + + for (int y = 0; y < height; y++){ + String row = ""; + for (int x = 0; x < width; x++){ + row += chars[x][y]; + //row += " "; + } + System.out.println(row); + } + + } + + public void placeTrack(Circuit channel, int track_number, int xmin, int xmax, ArrayList pins){ + int z_min = 1 + (3 * track_number); + int z_track = z_min + 1; + + for (int x = xmin; x <= xmax; x++){ + channel.setBlock(x, 1, z_track, Blocks.WOOL.getDefaultState()); + channel.setBlock(x, 2, z_track, Blocks.REDSTONE_WIRE.getDefaultState()); + } + + for (Pin p : pins){ + if (p.top) { + channel.setBlock(p.xPos(), 0, z_min, Blocks.WOOL.getDefaultState()); + channel.setBlock(p.xPos(), 1, z_min, Blocks.REDSTONE_WIRE.getDefaultState()); + } else { + channel.setBlock(p.xPos(), 0, z_track + 1, Blocks.WOOL.getDefaultState()); + channel.setBlock(p.xPos(), 1, z_track + 1, Blocks.REDSTONE_WIRE.getDefaultState()); + } + } + } + + public void wireColumns(Circuit channel, Net n) { + for (Pin p : n.getpins()){ + if (p.top) { + for (int z = 0; z < n.trackZ() - 1; z++){ + channel.setBlock(p.xPos(), 0, z, Blocks.REDSTONE_WIRE.getDefaultState()); + } + } else { + for (int z = n.trackZ() + 2; z < this.sizeZ(); z++){ + channel.setBlock(p.xPos(), 0, z, Blocks.REDSTONE_WIRE.getDefaultState()); + } + } + } + + if (n.isOutpath()){ + for (int z = n.trackZ() + 2; z < n.out_partner.trackZ() - 1; z++){ + channel.setBlock(n.x_max, 0, z, Blocks.REDSTONE_WIRE.getDefaultState()); + } + } + } + + public void repeatNets(Circuit channel, Net n) { + + for (Pin p : n.getpins()) { + if (p.top) { + if (n.trackZ() > 10) { + for (int z = n.trackZ() - 10; z > -1; z -= 10){ + channel.setBlock(p.xPos(), 0, z, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + } + } + + if (p.xPos() > n.x_min) { + channel.setBlock(p.xPos() - 1, 2, n.trackZ(), Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.EAST)); + } + + if (p.xPos() < n.x_max) { + channel.setBlock(p.xPos() + 1, 2, n.trackZ(), Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.WEST)); + } + } else { + if (channel.getSizeZ() - n.trackZ() > 10) { + for (int z = n.trackZ() + 3; z < channel.getSizeZ(); z += 10){ + channel.setBlock(p.xPos(), 0, z, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + } + } + + if (p.xPos() > n.x_min) { + if (p.xPos() > n.top_pin.xPos()) channel.setBlock(p.xPos() - 1, 2, n.trackZ(), Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.WEST)); + } + + if (p.xPos() < n.x_max) { + if (p.xPos() < n.top_pin.xPos()) channel.setBlock(p.xPos() + 1, 2, n.trackZ(), Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.EAST)); + } + } + } + + if (n.x_max - n.x_min > 19) { + for (int x = n.x_min + 2; x < n.x_max - 2; x += 14) { + for (Pin p : n.getpins()){ + if (x == p.xPos()) x-= 1; + } + + if (x < n.top_pin.xPos()) channel.setBlock(x, 2, n.trackZ(), Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.EAST)); + if (x > n.top_pin.xPos()) channel.setBlock(x, 2, n.trackZ(), Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.WEST)); + } + } + + if (n.isOutpath()){ + if (n.out_partner.trackZ() - n.trackZ() > 14) { + for (int z = n.trackZ() + 3; z < n.out_partner.trackZ() - 2; z += 13){ + channel.setBlock(n.x_max, 0, z, Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.NORTH)); + } + } + + channel.setBlock(n.x_max - 1, 2, n.trackZ(), Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.WEST)); + } + + if (!n.isOutpath() && n.out_partner != null){ + channel.setBlock(n.x_max - 1, 2, n.trackZ(), Blocks.UNPOWERED_REPEATER.getDefaultState().withProperty(Utils.getPropertyByName(Blocks.UNPOWERED_REPEATER, "facing"), EnumFacing.EAST)); + + } + } + + public int sizeX(){ + int x_max = 0; + + for (ArrayList t : this.tracks){ + for (Net n : t){ + if (n.x_max > x_max) x_max = n.x_max; + } + } + return x_max; + } + + public int sizeZ(){ + return 2 + (this.tracks.size() * 3); + } + +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/Net.java b/src/main/java/minecrafthdl/synthesis/routing/Net.java new file mode 100644 index 0000000..cf480f2 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/Net.java @@ -0,0 +1,103 @@ +package minecrafthdl.synthesis.routing; + +import minecrafthdl.MHDLException; +import minecrafthdl.synthesis.routing.pins.Pin; + +import java.util.ArrayList; + +/** + * Created by Francis O'Brien - 3/3/2017 - 6:18 AM + */ + +public class Net { + + public static int num_nets = 0; + + int id; + int track = -1; + + private ArrayList pins = new ArrayList(); + Pin top_pin; + + int x_min = Integer.MAX_VALUE, x_max = -1; + + + boolean outpath = false; + Pin out_pin; + Net out_partner; + + public Net(){ + this.id = Net.num_nets; + Net.num_nets++; + } + + public Net(int x_min, int x_max){ + this.id = Net.num_nets; + Net.num_nets++; + this.x_min = x_min; + this.x_max = x_max; + } + + public void addPin(Pin p, boolean dogleg){ + if (pins.contains(p)) return; + p.setNet(this.id, dogleg); + this.pins.add(p); + if (p.top) this.top_pin = p; + + if (p.xPos() < x_min) this.x_min = p.xPos(); + if (p.xPos() > x_max) this.x_max = p.xPos(); + } + + public boolean hasHorizontalConflict(Net other){ + if (this.x_max < other.x_min || this.x_min > other.x_max) return false; + return true; + } + + public void setTrack(int track){ + if (this.hasTrack()) throw new MHDLException("Net already has a track"); + this.track = track; + } + + public void setOutNet(Pin out_pin, Net original){ + this.pins.add(out_pin); + this.outpath = true; + this.out_pin = out_pin; + this.top_pin = out_pin; + out_pin.setNet(this.id, true); + + this.out_partner = original; + original.out_partner = this; + this.out_partner.pins.remove(out_pin); + } + + public int AssignOutColX(int out_col_x){ + this.x_max = out_col_x; + this.x_min = out_pin.xPos(); + this.out_partner.x_max = out_col_x; + return out_col_x; + } + + public boolean isOutpath(){ + return outpath; + } + + public boolean hasTrack(){ + return track != -1; + } + + public int getId(){ + return this.id; + } + + public ArrayList getpins() { + return pins; + } + + public void newXMax(int x_max) { + this.x_max = x_max; + } + + public int trackZ(){ + return (this.track == 0) ? 2 : (this.track * 3) + 2; + } +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/Router.java b/src/main/java/minecrafthdl/synthesis/routing/Router.java new file mode 100644 index 0000000..4770e2a --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/Router.java @@ -0,0 +1,174 @@ +package minecrafthdl.synthesis.routing; + +import MinecraftGraph.Function; +import MinecraftGraph.FunctionType; +import MinecraftGraph.Vertex; +import MinecraftGraph.VertexType; +import minecrafthdl.synthesis.Gate; +import minecrafthdl.synthesis.routing.pins.*; +import minecrafthdl.synthesis.routing.vcg.VerticalConstraintGraph; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Created by Francis on 2/22/2017. + */ +public class Router { + + public static Channel route(ArrayList top_vertices, ArrayList top_gates, ArrayList bottom_vertices, ArrayList bottom_gates, int gate_spacing){ + ArrayList top_pins, bottom_pins = new ArrayList(); + + + + return null; + } + + public static class PinInitRtn { + public HashMap pin_map; + public PinsArray pins_array; + } + + + public static PinInitRtn initializePins(ArrayList top_vertices, ArrayList top_gates, ArrayList bottom_vertices, ArrayList bottom_gates, int gate_spacing){ + PinInitRtn rtn = new PinInitRtn(); + + //Pin map init + HashMap pin_map = new HashMap(); + + if(top_gates.size() != top_vertices.size()) throw new RuntimeException("Top vertices and gates must be same size"); + if(bottom_gates.size() != bottom_vertices.size()) throw new RuntimeException("Bottom vertices and gates must be same size"); + + //top pins + int top_offset = 0; + for (int i = 0; i < top_vertices.size(); i++){ + GatePins gate_pins = new GatePins(top_gates.get(i), top_vertices.get(i), top_offset, true); + pin_map.put(top_vertices.get(i), gate_pins); + + top_offset += top_gates.get(i).getSizeX() + gate_spacing; + } + + //bottom pins + int bottom_offset = 0; + for (int i = 0; i < bottom_vertices.size(); i++){ + Vertex v = bottom_vertices.get(i); + + GatePins gate_pins = null; + if (v.type == VertexType.FUNCTION && ((Function)v).func_type == FunctionType.MUX){ + gate_pins = new MuxPins(bottom_gates.get(i), bottom_vertices.get(i), bottom_offset, false); + } else { + gate_pins = new GatePins(bottom_gates.get(i), bottom_vertices.get(i), bottom_offset, false); + } + pin_map.put(bottom_vertices.get(i), gate_pins); + + bottom_offset += bottom_gates.get(i).getSizeX() + gate_spacing; + } + + rtn.pin_map = pin_map; + + //Pins array init + PinsArray pins_array = new PinsArray(); + + //top pins + for (Vertex v : top_vertices){ + for (Pin p : pin_map.get(v).getPins()){ + pins_array.addPin(p, true); + } + } + + //bottom pins + for (Vertex v : bottom_vertices){ + for (Pin p : pin_map.get(v).getPins()){ + pins_array.addPin(p, false); + } + } + + rtn.pins_array = pins_array; + + return rtn; + } + + public static HashMap initializeNets(ArrayList top_vertices, ArrayList bottom_vertices, HashMap pin_map) { + HashMap nets = new HashMap(); + + for (Vertex v : top_vertices){ + GatePins gate = pin_map.get(v); + + while (gate.hasNextPin()){ + Pin next_pin = gate.getNextPin(v); + if (next_pin.empty() || next_pin.hasNet()) continue; + + Net net = new Net(); + nets.put(net.id, net); + net.addPin(next_pin, false); + + for (Vertex next_vertex : v.getNext()){ + net.addPin(pin_map.get(next_vertex).getNextPin(v), false); + } + } + } + + for (Vertex v : bottom_vertices){ + GatePins gate = pin_map.get(v); + + while (gate.hasNextPin()){ + Pin next_pin = gate.getNextPin(v); + if (next_pin.empty() || next_pin.hasNet()) continue; + + Net net = new Net(); + nets.put(net.id, net); + net.addPin(next_pin, false); + + for (Vertex next_vertex : v.getNext()){ + net.addPin(pin_map.get(next_vertex).getNextPin(v), false); + } + } + } + + return nets; + } + + public static Channel placeNets(HashMap nets, PinsArray pin_pairs){ + VerticalConstraintGraph vcg = new VerticalConstraintGraph(pin_pairs, nets); + + Channel channel = new Channel(); + channel.pinsArray = pin_pairs; + + while (!vcg.done()){ + for (PinPair pair : pin_pairs.getPairs()){ + + if (!pair.top.empty() && vcg.canRoute(pair.top.netID())){ + channel.findAvailableTrack(nets.get(pair.top.netID()), vcg); + vcg.routed(pair.top.netID()); + break; + } + + if (!pair.bot.empty() && vcg.canRoute(pair.bot.netID())){ + channel.findAvailableTrack(nets.get(pair.bot.netID()), vcg); + vcg.routed(pair.bot.netID()); + break; + } + } + } + + return channel; + + } + + public static void printPins(HashMap pin_map, ArrayList top_vertices, ArrayList bottom_vertices){ + String str = ""; + for (Vertex v : top_vertices){ + str += pin_map.get(v).printPins() + "|"; + } + + System.out.println(str + "\n"); + + str = ""; + + for (Vertex v : bottom_vertices){ + str += pin_map.get(v).printPins() + "|"; + } + + System.out.println(str + "\n"); + } +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/pins/EmptyPin.java b/src/main/java/minecrafthdl/synthesis/routing/pins/EmptyPin.java new file mode 100644 index 0000000..7f9c445 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/pins/EmptyPin.java @@ -0,0 +1,21 @@ +package minecrafthdl.synthesis.routing.pins; + +import minecrafthdl.MHDLException; + +/** + * Created by Francis O'Brien - 3/4/2017 - 5:41 AM + */ + +public class EmptyPin extends Pin { + public EmptyPin(int x, boolean top) { + super(x, top); + } + + public void setNet(int net_id, boolean out_net){ + throw new MHDLException("Cant set net of empty pin"); + } + + public boolean empty(){ + return true; + } +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/pins/GatePins.java b/src/main/java/minecrafthdl/synthesis/routing/pins/GatePins.java new file mode 100644 index 0000000..c240229 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/pins/GatePins.java @@ -0,0 +1,80 @@ +package minecrafthdl.synthesis.routing.pins; + +import MinecraftGraph.Vertex; +import minecrafthdl.MHDLException; +import minecrafthdl.synthesis.Gate; + +import java.util.ArrayList; + +/** + * Created by Francis O'Brien - 3/3/2017 - 9:43 AM + */ + +public class GatePins { + + private final Vertex vertex; + protected ArrayList pins = new ArrayList(); + + protected int next_free_input_pin = 0; + protected int next_free_output_pin = 0; + + protected int gate_width; + protected int offset; + protected boolean top; + + public GatePins(Gate g, Vertex v, int offset, boolean top){ + this.vertex = v; + this.offset = offset; + this.top = top; + this.gate_width = g.getSizeX(); + + if (top){ + for(int i = 0; i < g.num_outputs; i++){ + pins.add(new Pin(offset + (i * (1 + g.output_spacing)), true)); + } + } else { + for(int i = 0; i < g.num_inputs; i++){ + pins.add(new Pin(offset + (i * (1 + g.input_spacing)), false)); + } + } + } + + public ArrayList getPins(){ + return this.pins; + } + + public boolean hasNet(int net_id){ + for (Pin p : this.pins) { + if (p.netID() == net_id) return true; + } + return false; + } + + public Pin getNextPin(Vertex v){ + if (next_free_input_pin == this.pins.size()) { + throw new MHDLException("To many input pins requested from gate"); + } + + this.next_free_input_pin += 1; + return pins.get(this.next_free_input_pin - 1); + } + + public boolean hasNextPin(){ + return next_free_input_pin < this.pins.size(); + } + + public String printPins(){ + String str = ""; + for (int i = 0; i < gate_width; i++) { + str += "."; + } + + for(Pin p : pins){ + if(p.x - offset == 0) str = 'x' + str.substring(p.x - offset + 1); + else if (p.x - offset == gate_width - 1) str = str.substring(0, p.x - offset) + 'x'; + else str = str.substring(0, p.x - offset) + 'x' + str.substring(p.x - offset + 1); + } + + return str; + } +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/pins/MuxPins.java b/src/main/java/minecrafthdl/synthesis/routing/pins/MuxPins.java new file mode 100644 index 0000000..5239f98 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/pins/MuxPins.java @@ -0,0 +1,55 @@ +package minecrafthdl.synthesis.routing.pins; + +import MinecraftGraph.*; +import minecrafthdl.MHDLException; +import minecrafthdl.synthesis.Gate; + +/** + * Created by Francis O'Brien - 4/7/2017 - 5:28 + */ + +public class MuxPins extends GatePins { + MuxVertex mux_v; + + boolean a_requested = false; + boolean b_requested = false; + boolean s_requested = false; + + public MuxPins(Gate g, Vertex v, int offset, boolean top) { + super(g, v, offset, top); + if (v.type == VertexType.FUNCTION && ((Function)v).func_type == FunctionType.MUX){ + this.mux_v = (MuxVertex)v; + } else { + throw new MHDLException("CANT MAKE MUX PINS WITH NON_MUX VERTEX"); + } + } + + @Override + public Pin getNextPin(Vertex v){ + this.next_free_input_pin += 1; + if (v == this.mux_v.a_vertex) { + if (!a_requested){ + this.a_requested = true; + return this.pins.get(0); + } + else throw new RuntimeException("A PIN ALREADY REQUESTED"); + } + else if (v == this.mux_v.b_vertex) { + if (!b_requested){ + this.b_requested = true; + return this.pins.get(2); + } + else throw new RuntimeException("B PIN ALREADY REQUESTED"); + } + else if (v == this.mux_v.s_vertex) { + if (!s_requested){ + this.s_requested = true; + return this.pins.get(1); + } + else throw new RuntimeException("S PIN ALREADY REQUESTED"); + } + else { + throw new RuntimeException("INPUT PIN MUST BE REQUESTED BY A VALID VERTEX"); + } + } +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/pins/Pin.java b/src/main/java/minecrafthdl/synthesis/routing/pins/Pin.java new file mode 100644 index 0000000..9b560df --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/pins/Pin.java @@ -0,0 +1,41 @@ +package minecrafthdl.synthesis.routing.pins; + +import minecrafthdl.MHDLException; + +/** + * Created by Francis on 2/22/2017. + */ +public class Pin { + int x; + int net = -1; + public boolean top; + + public Pin(int x, boolean top){ + this.x = x; + this.top = top; + } + + public void setNet(int net_id, boolean out_net){ + if (!out_net && this.net != -1) { + throw new MHDLException("Should not assign pin to two different nets"); + } + + this.net = net_id; + } + + public int xPos(){ + return this.x; + } + + public int netID(){ + return this.net; + } + + public boolean empty(){ + return false; + } + + public boolean hasNet() { + return this.netID() != -1; + } +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/pins/PinPair.java b/src/main/java/minecrafthdl/synthesis/routing/pins/PinPair.java new file mode 100644 index 0000000..d3216a0 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/pins/PinPair.java @@ -0,0 +1,15 @@ +package minecrafthdl.synthesis.routing.pins; + +/** + * Created by Francis O'Brien - 3/4/2017 - 6:36 AM + */ + +public class PinPair { + public Pin top, bot; + + public PinPair(int x){ + this.top = new EmptyPin(x, true); + this.bot = new EmptyPin(x, false); + } + +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/pins/PinsArray.java b/src/main/java/minecrafthdl/synthesis/routing/pins/PinsArray.java new file mode 100644 index 0000000..af95157 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/pins/PinsArray.java @@ -0,0 +1,58 @@ +package minecrafthdl.synthesis.routing.pins; + +import minecrafthdl.MHDLException; + +import java.util.ArrayList; + +/** + * Created by Francis O'Brien - 3/4/2017 - 5:37 AM + */ + +public class PinsArray { + ArrayList pairs; + + public PinsArray() { + pairs = new ArrayList(); + } + + + public void addPin(Pin p, boolean top) { + int index = p.x / 2; + int difference = index - this.pairs.size(); + + if (difference >= 0){ + for (int i = 0; i < difference; i++){ + this.pairs.add(new PinPair(this.pairs.size() * 2)); + } + PinPair new_pair = new PinPair(this.pairs.size() * 2); + if(top) new_pair.top = p; + else new_pair.bot = p; + + this.pairs.add(new_pair); + } else { + PinPair pair = this.pairs.get(index); + + if(top){ + if (pair.top.empty()) pair.top = p; + else throw new MHDLException("Attempting to overwrite pin in pair"); + } else { + if (pair.bot.empty()) pair.bot = p; + else throw new MHDLException("Attempting to overwrite pin in pair"); + } + } + } + + public int addEmptyPair(){ + int x = this.pairs.size() * 2; + this.pairs.add(new PinPair(x)); + return x; + } + + public PinPair getPair(int index){ + return this.pairs.get(index); + } + + public ArrayList getPairs(){ + return this.pairs; + } +} diff --git a/src/main/java/minecrafthdl/synthesis/routing/vcg/VerticalConstraintGraph.java b/src/main/java/minecrafthdl/synthesis/routing/vcg/VerticalConstraintGraph.java new file mode 100644 index 0000000..a743612 --- /dev/null +++ b/src/main/java/minecrafthdl/synthesis/routing/vcg/VerticalConstraintGraph.java @@ -0,0 +1,140 @@ +package minecrafthdl.synthesis.routing.vcg; + +import minecrafthdl.MHDLException; +import org.apache.commons.lang3.tuple.ImmutablePair; +import minecrafthdl.synthesis.routing.Net; +import minecrafthdl.synthesis.routing.pins.PinPair; +import minecrafthdl.synthesis.routing.pins.PinsArray; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * Created by Francis O'Brien - 3/4/2017 - 9:29 AM + */ + +public class VerticalConstraintGraph { + + int num_nets_routed = 0; + ArrayList> edges_done = new ArrayList>(); + + public int[] getEdgeIDList(int id) { + Node n = nodes.get(id); + + int[] vc_ids = new int[n.edges.size()]; + + for (int i = 0; i < n.edges.size(); i++){ + vc_ids[i] = n.edges.get(i).to.net_id; + } + + return vc_ids; + } + + private static class Node { + public boolean routed = false; + public ArrayList edges = new ArrayList(); + + int net_id; + + public Node(int net_id){ + this.net_id = net_id; + } + } + + private static class Edge { + public Node to; + + public Edge(Node to){ + this.to = to; + } + } + + private HashMap nodes = new HashMap(); + + public VerticalConstraintGraph(PinsArray pin_pairs, HashMap nets) { + ArrayList original_pairs = new ArrayList(pin_pairs.getPairs()); + for(PinPair pair : original_pairs){ + if (!pair.top.empty()){ + if(!this.nodes.containsKey(pair.top.netID())) this.nodes.put(pair.top.netID(), new Node(pair.top.netID())); + } + + if (!pair.bot.empty()){ + if(!this.nodes.containsKey(pair.bot.netID())) this.nodes.put(pair.bot.netID(), new Node(pair.bot.netID())); + } + + if (!pair.top.empty() && !pair.bot.empty() && pair.top.netID() != pair.bot.netID()) { + + if(edgeDone(pair.top.netID(), pair.bot.netID())) continue; + + if (!cycle(this.nodes.get(pair.top.netID()), pair.bot.netID())){ + this.nodes.get(pair.bot.netID()).edges.add(new Edge(this.nodes.get(pair.top.netID()))); + this.edges_done.add(new ImmutablePair(pair.top.netID(), pair.bot.netID())); + } else { + Net out_net = new Net(); + Net out_partner = nets.get(pair.top.netID()); + + out_net.setOutNet(pair.top, out_partner); + + int x_max = out_net.AssignOutColX(pin_pairs.addEmptyPair()); + + out_partner.newXMax(x_max); + + nets.put(out_net.getId(), out_net); + + Node out_node = new Node(out_net.getId()); + this.nodes.put(out_net.getId(), out_node); + this.nodes.get(pair.bot.netID()).edges.add(new Edge(out_node)); + this.edges_done.add(new ImmutablePair(pair.top.netID(), pair.bot.netID())); + } + + } + } + System.out.println(); + } + + public boolean edgeDone(int top, int bot){ + for (ImmutablePair pair : this.edges_done){ + if (pair.getKey() == top && pair.getValue() == bot) return true; + } + + return false; + } + + public static boolean cycle(Node n, int cycle_id){ + if (cycle_id == 1){ + System.out.println(""); + + } + if (n.net_id == cycle_id) return true; + for (Edge e : n.edges){ + if (cycle(e.to, cycle_id)){ + return true; + } + } + return false; + } + + + public boolean canRoute(int netID){ + Node n = this.nodes.get(netID); + + if (n.routed) return false; + + for (Edge e : n.edges){ + if(!e.to.routed) return false; + } + return true; + } + + public void routed(int netID){ + if (this.nodes.get(netID).routed) throw new MHDLException("Routed same net twice"); + + this.nodes.get(netID).routed = true; + this.num_nets_routed++; + } + + public boolean done(){ + return this.nodes.values().size() == this.num_nets_routed; + } + +} diff --git a/src/main/java/minecrafthdl/testing/RouterTesting.java b/src/main/java/minecrafthdl/testing/RouterTesting.java new file mode 100644 index 0000000..3f34dca --- /dev/null +++ b/src/main/java/minecrafthdl/testing/RouterTesting.java @@ -0,0 +1,25 @@ +package minecrafthdl.testing; + +import minecrafthdl.Demo; +import minecrafthdl.synthesis.Circuit; +import minecrafthdl.synthesis.IntermediateCircuit; + +/** + * Created by Francis O'Brien - 3/4/2017 - 1:54 AM + */ + +public class RouterTesting { + + public static void main(String[] args){ + Circuit.TEST = true; + IntermediateCircuit ic = new IntermediateCircuit(); + ic.loadGraph(Demo.create4bitmuxgraph()); + ic.buildGates(); + ic.printLayers(); + ic.routeChannels(); + ic.channels.get(1).genChannelCircuit(); + } + + + +} diff --git a/src/main/java/minecrafthdl/testing/TestGate.java b/src/main/java/minecrafthdl/testing/TestGate.java new file mode 100644 index 0000000..0e175cb --- /dev/null +++ b/src/main/java/minecrafthdl/testing/TestGate.java @@ -0,0 +1,45 @@ +package minecrafthdl.testing; + +import minecrafthdl.synthesis.Gate; + +import java.util.ArrayList; + +/** + * Created by Francis O'Brien - 3/4/2017 - 2:31 AM + */ + +public class TestGate extends Gate { + + private ArrayList>> sblocks; + + public TestGate(int sizeX, int sizeY, int sizeZ, int num_inputs, int num_outputs, int input_spacing, int output_spacing, int[] output_lines) { + super(sizeX, sizeY, sizeZ, num_inputs, num_outputs, input_spacing, output_spacing, output_lines); + + this.sblocks = new ArrayList>>(); + for (int x = 0; x < sizeX; x++) { + this.sblocks.add(new ArrayList>()); + for (int y = 0; y < sizeY; y++) { + this.sblocks.get(x).add(new ArrayList()); + for (int z = 0; z < sizeZ; z++) { + this.sblocks.get(x).get(y).add("."); + } + } + } + } + + public void setBlock(int x, int y, int z, String blockstate) { + this.sblocks.get(x).get(y).set(z, blockstate); + } + + public void printGate(){ + for(int y = 0; y < this.getSizeX(); y++) { + for (int z = 0; z < this.getSizeX(); z++) { + for(int x = 0; x < this.getSizeX(); x++){ + System.out.print(this.sblocks.get(x).get(y).get(z)); + } + System.out.print("\n"); + } + System.out.print("\n"); + } + } +} diff --git a/src/main/java/minecrafthdl/testing/TestLogicGates.java b/src/main/java/minecrafthdl/testing/TestLogicGates.java new file mode 100644 index 0000000..696c13b --- /dev/null +++ b/src/main/java/minecrafthdl/testing/TestLogicGates.java @@ -0,0 +1,110 @@ +package minecrafthdl.testing; + +import minecrafthdl.Demo; +import minecrafthdl.MHDLException; +import minecrafthdl.synthesis.Gate; +import minecrafthdl.synthesis.IntermediateCircuit; +import minecrafthdl.synthesis.LogicGates; + +/** + * Created by Francis O'Brien - 3/4/2017 - 2:35 AM + */ + +public class TestLogicGates extends LogicGates { + + + + public static void main(String[] args) { + IntermediateCircuit ic = new IntermediateCircuit(); + ic.loadGraph(Demo.create4bitmuxgraph()); + ic.printLayers(); + } + + public static Gate IO(){ + TestGate gate = new TestGate(1, 1, 1, 1, 1, 0, 0, new int[]{0}); + gate.setBlock(0, 0, 0, "x"); + return gate; + } + + public static Gate NOT(){ + TestGate gate = new TestGate(1, 1, 5, 1, 1, 0, 0, new int[]{0}); + gate.setBlock(0, 0, 0, "x"); + gate.setBlock(0, 0, 1, "i"); + gate.setBlock(0, 0, 2, "*"); + gate.setBlock(0, 0, 3, "*"); + gate.setBlock(0, 0, 4, "x"); + return gate; + } + + public static Gate RELAY(){ + TestGate gate = new TestGate(1, 1, 5, 1, 1, 0, 0, new int[]{0}); + gate.setBlock(0, 0, 0, "x"); + gate.setBlock(0, 0, 1, "*"); + gate.setBlock(0, 0, 2, ">"); + gate.setBlock(0, 0, 3, "*"); + gate.setBlock(0, 0, 4, "x"); + return gate; + } + + public static Gate AND(int inputs) { + if (inputs == 0) throw new MHDLException("Gate cannot have 0 inputs"); + int width; + if (inputs == 1) width = 1; + + else width = (inputs * 2) - 1; + + TestGate gate = new TestGate(width, 2, 5, inputs, 1, 1, 0, new int[]{0}); + + gate.setBlock(0, 0, 2, "i"); + gate.setBlock(0, 0, 3, "*"); + gate.setBlock(0, 0, 4, "x"); + + for (int i = 0; i < width; i+=2) { + gate.setBlock(i, 0, 0, "x"); + gate.setBlock(i, 0, 1, "x"); + gate.setBlock(i, 1, 0, "i"); + gate.setBlock(i, 1, 1, "*"); + + if (i != width - 1) { + gate.setBlock(i + 1, 0, 1, "x"); + if (i == 14) { + gate.setBlock(i + 1, 1, 1, ">"); + } else { + gate.setBlock(i + 1, 1, 1, "*"); + } + } + } + + return gate; + } + + + + public static Gate OR(int inputs) { + if (inputs == 0) throw new MHDLException("Gate cannot have 0 inputs"); + int width; + if (inputs == 1) width = 1; + else width = (inputs * 2) - 1; + + TestGate gate = new TestGate(width, 2, 5, inputs, 1, 1, 0, new int[]{0}); + + gate.setBlock(0, 0, 3, "*"); + gate.setBlock(0, 0, 4, "x"); + + for (int i = 0; i < width; i+=2) { + gate.setBlock(i, 0, 0, "x"); + gate.setBlock(i, 0, 1, ">"); + gate.setBlock(i, 0, 2, "*"); + if (i != width - 1) { + if (i == 14) { + gate.setBlock(i + 1, 0, 2, ">"); + } else { + gate.setBlock(i + 1, 0, 2, "*"); + } + } + } + return gate; + } + + +} diff --git a/src/main/main.iml b/src/main/main.iml new file mode 100644 index 0000000..908ad4f --- /dev/null +++ b/src/main/main.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/assets/minecrafthdl/blockstates/tutorial_block.json b/src/main/resources/assets/minecrafthdl/blockstates/tutorial_block.json new file mode 100644 index 0000000..7fea26a --- /dev/null +++ b/src/main/resources/assets/minecrafthdl/blockstates/tutorial_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "triggered=true": { + "model": "minecrafthdl:tutorial_block" + }, + "triggered=false": { + "model": "minecrafthdl:tutorial_block" + } + } +} diff --git a/src/main/resources/assets/minecrafthdl/models/block/tutorial_block.json b/src/main/resources/assets/minecrafthdl/models/block/tutorial_block.json new file mode 100644 index 0000000..3ecaa20 --- /dev/null +++ b/src/main/resources/assets/minecrafthdl/models/block/tutorial_block.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "minecrafthdl:blocks/tutorial_block" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecrafthdl/models/item/tutorial_block.json b/src/main/resources/assets/minecrafthdl/models/item/tutorial_block.json new file mode 100644 index 0000000..de181d2 --- /dev/null +++ b/src/main/resources/assets/minecrafthdl/models/item/tutorial_block.json @@ -0,0 +1,10 @@ +{ + "parent":"minecrafthdl:block/tutorial_block", + "display": { + "thirdperson": { + "rotation": [ 10, -45, 170 ], + "translation": [ 0, 1.5, -2.75 ], + "scale": [ 0.375, 0.375, 0.375 ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/minecrafthdl/textures/blocks/tutorial_block.png b/src/main/resources/assets/minecrafthdl/textures/blocks/tutorial_block.png new file mode 100644 index 0000000000000000000000000000000000000000..5d2500c76b433117a59111f7649a45c8d563e883 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv{ftb%N!Op=o){|5?5l(rIsj|=o#pl{pm@*4^%VJ)5S5w!hh<-gS-t2JgzreTDaZaKU`>b zcPkJzFBS>^IDMOnm-B;G=bsO!E?PLHC?sG`eBHvF=8)?wN}qY9d=4B+sZNZ1V6M~q zgxm7@luKb3Pb4rVzdUzfXZ8L05(_g^K1f$FnmZhDS~&3`cSg_RcOLr;4%8oRNNsd~ vW&fH%RIT33Z?l6-(7~M6l1$DCEgf-j2ZA;$uRL!FbR2`HtDnm{r-UW|8EI_E literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecrafthdl/textures/gui/synthesiser.png b/src/main/resources/assets/minecrafthdl/textures/gui/synthesiser.png new file mode 100644 index 0000000000000000000000000000000000000000..106288f761988a13ae21231e1d9c12ac0bf41c0d GIT binary patch literal 1751 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~62^QA&dRf`N&DBm;)v@9e6; zXy+{Oh%9Dc;M)(vj25iHzyM;9C~=J_3C>R|DNig)Whh9@%q!8$OD$0_(KFC9`_q$r zpMinN*3-o?q$2L^P47GzLjl%<+w8vE7u`-)=P`ev%B~PNarXA)=}ecruGhvtFIoS7 z*ZTLxRm}%VFP;DYcWc}O^8?p4Yio4GD;U50Vgwdm3wBQj7E%lhd+Qv4O^$5&>c2jIs1Z2(GvJ@r7L zp}(Br&h^)KldG5y)PDWOsr&zDJj4EfJbf?EU(~KXJUN|pfvj{xSq{Ukjf@$`*#?|r eCi7rlJ=5-9`{X+FiLZeEVDNPHb6Mw<&;$VeodQw- literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info new file mode 100644 index 0000000..eaf0189 --- /dev/null +++ b/src/main/resources/mcmod.info @@ -0,0 +1,16 @@ +[ +{ + "modid": "minecrafthdl", + "name": "Minecraft HDL", + "description": "Hardware synthesis for Minecraft", + "version": "${version}", + "mcversion": "${mcversion}", + "url": "", + "updateUrl": "", + "authorList": ["itsfrank"], + "credits": "The Forge and FML guys, for making this example", + "logoFile": "", + "screenshots": [], + "dependencies": [] +} +] diff --git a/src/main/tests/Verilogfiles/and.v b/src/main/tests/Verilogfiles/and.v new file mode 100644 index 0000000..c6330a4 --- /dev/null +++ b/src/main/tests/Verilogfiles/and.v @@ -0,0 +1,7 @@ +module AND(a, b, c, d); + +input a, b, c; +output d; +assign d=a&b&c; + +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/counter.v b/src/main/tests/Verilogfiles/counter.v new file mode 100644 index 0000000..3ee705c --- /dev/null +++ b/src/main/tests/Verilogfiles/counter.v @@ -0,0 +1,24 @@ +//module counter +// bits simple counter +//with enable and reset + +module counter( +out, +enable, +reset, +clk +); +output [7:0] out; +input enable, reset, clk; +reg [7:0] out; + +always @(posedge clk) +if (reset) begin + out<=8'b0; +end +else if (enable) begin + out<=out+1; +end + + +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/multiplexer.v b/src/main/tests/Verilogfiles/multiplexer.v new file mode 100644 index 0000000..209ac10 --- /dev/null +++ b/src/main/tests/Verilogfiles/multiplexer.v @@ -0,0 +1,17 @@ +module mux(a, b, sel, out ); + +input a,b, sel; +output out; + +always @(a, b, sel) + +if (sel) begin + out<=a; +end +else begin + out<=b; +end + + +endmodule + diff --git a/src/main/tests/Verilogfiles/onebitadder.v b/src/main/tests/Verilogfiles/onebitadder.v new file mode 100644 index 0000000..eb8d56a --- /dev/null +++ b/src/main/tests/Verilogfiles/onebitadder.v @@ -0,0 +1,21 @@ +module veriglLearn( + input a, input b, + input cin, + output cout, + output sum); + + + wire x, y; + //adder xor gates + xor G1(sum, a, b, cin); + and G2(x, a, b); + and G3(y, sum, cin); + or G4(cout, x, y); + + + + + + + +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/or.v b/src/main/tests/Verilogfiles/or.v new file mode 100644 index 0000000..bdc7acf --- /dev/null +++ b/src/main/tests/Verilogfiles/or.v @@ -0,0 +1,5 @@ +module OR(a, b, c, out); +input a, b, c; +output out; +OR G1(out, a, b, c); +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/test1.v b/src/main/tests/Verilogfiles/test1.v new file mode 100644 index 0000000..373265a --- /dev/null +++ b/src/main/tests/Verilogfiles/test1.v @@ -0,0 +1,7 @@ +module test12(a, b, c, d, e, f, g, h, out); + +input a, b, c,d, e,f,g,h; +output out; +assign out=a&b&c&d&e&f&g&h; + +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/test23.v b/src/main/tests/Verilogfiles/test23.v new file mode 100644 index 0000000..4378dc7 --- /dev/null +++ b/src/main/tests/Verilogfiles/test23.v @@ -0,0 +1,15 @@ +//test multiple different gates + +module test(a, b, c, d, out); + input a, b, c, d; + output out; + wire x, y, z, w; + assign x=a&b; + assign y=c&d; + assign z=x&y; + assign w=x&y; + + assign out=z&w; + + +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/test33.v b/src/main/tests/Verilogfiles/test33.v new file mode 100644 index 0000000..ce3a291 --- /dev/null +++ b/src/main/tests/Verilogfiles/test33.v @@ -0,0 +1,11 @@ +//test when can not merge + +module test(a, b, c, d, out1, out2); + input a, b, c, d; + output out1, out2; + wire x; + assign x=a&b; + assign out1=x&c; + assign out2=x|d; + +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/testAND.v b/src/main/tests/Verilogfiles/testAND.v new file mode 100644 index 0000000..85d5558 --- /dev/null +++ b/src/main/tests/Verilogfiles/testAND.v @@ -0,0 +1,4 @@ +module testAND(input a, input b, output c); +AND G1(c, a, b); +endmodule + diff --git a/src/main/tests/Verilogfiles/testAO.v b/src/main/tests/Verilogfiles/testAO.v new file mode 100644 index 0000000..b215514 --- /dev/null +++ b/src/main/tests/Verilogfiles/testAO.v @@ -0,0 +1,13 @@ +//test multiple different gates + +module test(a, b, c, d, e, f, g, out); + input a, b, c, d, e, f, g; + output out; + wire x, y, z; + assign x=a&b&c; + assign y=x|d; + assign z=x&g; + assign out=z|y|f&a; + + +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/testMajority.v b/src/main/tests/Verilogfiles/testMajority.v new file mode 100644 index 0000000..1ec5aea --- /dev/null +++ b/src/main/tests/Verilogfiles/testMajority.v @@ -0,0 +1,8 @@ +module testMajority(a, b, c, d); +input a, b, c; +output d; + +assign d=(a&c)|(a&b)|(b&c); + + +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/test_arrays.v b/src/main/tests/Verilogfiles/test_arrays.v new file mode 100644 index 0000000..e542e1a --- /dev/null +++ b/src/main/tests/Verilogfiles/test_arrays.v @@ -0,0 +1,8 @@ +module test(a, b); + +input [3:0]a; +output [1:0]b; +assign b[0]=a[0]&a[2]; +assign b[1]=a[1] | a[3]; + +endmodule \ No newline at end of file diff --git a/src/main/tests/Verilogfiles/test_pattern.v b/src/main/tests/Verilogfiles/test_pattern.v new file mode 100644 index 0000000..ae95af0 --- /dev/null +++ b/src/main/tests/Verilogfiles/test_pattern.v @@ -0,0 +1,62 @@ +module test(in, clk, out); + +input in, clk; +output out; +reg out; + +parameter ONE=2'b00, TWO=2'b01, THREE=2'b10; +reg [1:0] state; +wire [1:0] next_state; + +assign next_state=fsm_state(state, in); + +function [1:0] fsm_state; + + input [1:0] state; + input in; + case(state) + ONE: if(in==1'b1) begin + fsm_state=ONE; + end + else begin + fsm_state=TWO; + end + TWO: if (in==1'b1) begin + fsm_state=ONE; + end + else begin + fsm_state=THREE; + end + THREE: if(in==1'b1) begin + fsm_state=THREE; + end + else begin + fsm_state=ONE; + end + default: fsm_state=ONE; //shoud never be accessed + endcase + endfunction +//define states + +always @(posedge clk) +begin +state<=next_state; +end + + +always @(posedge clk) +begin + +case(state) +ONE: out<=#1 1'b0; +TWO: out<=#1 1'b0; +THREE: out<=#1 1'b1; +default: out<=#1 1'b0; + +endcase + +end + + + +endmodule \ No newline at end of file diff --git a/src/main/tests/json b/src/main/tests/json new file mode 100644 index 0000000..e69de29 diff --git a/src/main/tests/json files/and.json b/src/main/tests/json files/and.json new file mode 100644 index 0000000..f7c700b --- /dev/null +++ b/src/main/tests/json files/and.json @@ -0,0 +1,981 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "AND": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "d": { + "direction": "output", + "bits": [ 5 ] + } + }, + "cells": { + "$and$tests/and.v:5$630": { + "hide_name": 1, + "type": "$and", + "parameters": { + "A_SIGNED": 0, + "A_WIDTH": 1, + "B_SIGNED": 0, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": { + "src": "tests/and.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 3 ], + "Y": [ 6 ] + } + }, + "$and$tests/and.v:5$631": { + "hide_name": 1, + "type": "$and", + "parameters": { + "A_SIGNED": 0, + "A_WIDTH": 1, + "B_SIGNED": 0, + "B_WIDTH": 1, + "Y_WIDTH": 1 + }, + "attributes": { + "src": "tests/and.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ 4 ], + "Y": [ 5 ] + } + } + }, + "netnames": { + "$and$tests/and.v:5$630_Y": { + "hide_name": 1, + "bits": [ 6 ], + "attributes": { + "src": "tests/and.v:5" + } + }, + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/and.v:3" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/and.v:3" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/and.v:3" + } + }, + "d": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "tests/and.v:4" + } + } + } + }, + "counter": { + "ports": { + "out": { + "direction": "output", + "bits": [ 2, 3, 4, 5, 6, 7, 8, 9 ] + }, + "enable": { + "direction": "input", + "bits": [ 10 ] + }, + "reset": { + "direction": "input", + "bits": [ 11 ] + }, + "clk": { + "direction": "input", + "bits": [ 12 ] + } + }, + "cells": { + "$auto$simplemap.cc:277:simplemap_mux$57": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 13 ], + "S": [ 10 ], + "Y": [ 14 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$58": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 3 ], + "B": [ 15 ], + "S": [ 10 ], + "Y": [ 16 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$59": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 4 ], + "B": [ 17 ], + "S": [ 10 ], + "Y": [ 18 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$60": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 5 ], + "B": [ 19 ], + "S": [ 10 ], + "Y": [ 20 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$61": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ 21 ], + "S": [ 10 ], + "Y": [ 22 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$62": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "B": [ 23 ], + "S": [ 10 ], + "Y": [ 24 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$63": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 8 ], + "B": [ 25 ], + "S": [ 10 ], + "Y": [ 26 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$64": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 9 ], + "B": [ 27 ], + "S": [ 10 ], + "Y": [ 28 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$65": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 14 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 29 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$66": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 16 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 30 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$67": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 18 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 31 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$68": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 20 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 32 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$69": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 22 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 33 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$70": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 24 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 34 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$71": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 26 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 35 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$72": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 28 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 36 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$73": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 29 ], + "Q": [ 2 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$74": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 30 ], + "Q": [ 3 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$75": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 31 ], + "Q": [ 4 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$76": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 32 ], + "Q": [ 5 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$77": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 33 ], + "Q": [ 6 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$78": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 34 ], + "Q": [ 7 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$79": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 35 ], + "Q": [ 8 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$80": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 36 ], + "Q": [ 9 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$119": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 3 ], + "B": [ 2 ], + "Y": [ 15 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$120": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 4 ], + "B": [ 37 ], + "Y": [ 17 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$121": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 5 ], + "B": [ 38 ], + "Y": [ 19 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$122": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ 39 ], + "Y": [ 21 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$123": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "B": [ 40 ], + "Y": [ 23 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$124": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 8 ], + "B": [ 41 ], + "Y": [ 25 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$125": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 9 ], + "B": [ 42 ], + "Y": [ 27 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$489": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:221" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 3 ], + "B": [ 2 ], + "Y": [ 37 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$505": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:221" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 43 ], + "B": [ 37 ], + "Y": [ 39 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$520": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:222" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 5 ], + "B": [ 4 ], + "Y": [ 43 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$521": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:222" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "B": [ 6 ], + "Y": [ 44 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$550": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:229" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 44 ], + "B": [ 39 ], + "Y": [ 41 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$557": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:229" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 4 ], + "B": [ 37 ], + "Y": [ 38 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$558": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:229" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ 39 ], + "Y": [ 40 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$559": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:229" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 8 ], + "B": [ 41 ], + "Y": [ 42 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$86": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":262" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ "1" ], + "Y": [ 13 ] + } + } + }, + "netnames": { + "$0\\out[7:0]": { + "hide_name": 1, + "bits": [ 29, 30, 31, 32, 33, 34, 35, 36 ], + "attributes": { + "src": "tests/counter.v:15" + } + }, + "$add$tests/counter.v:20$2_Y": { + "hide_name": 1, + "bits": [ 13, 15, 17, 19, 21, 23, 25, 27, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68 ], + "attributes": { + "src": "tests/counter.v:20" + } + }, + "$procmux$4_Y": { + "hide_name": 1, + "bits": [ 14, 16, 18, 20, 22, 24, 26, 28 ], + "attributes": { + } + }, + "$techmap$add$tests/counter.v:20$2.$auto$alumacc.cc:470:replace_alu$54.lcu.g": { + "hide_name": 1, + "bits": [ 69, 37, 38, 39, 40, 41, 42, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94 ], + "attributes": { + "src": ":260|:203" + } + }, + "$techmap$techmap$add$tests/counter.v:20$2.$auto$alumacc.cc:470:replace_alu$54.lcu.$and$:222$258_Y": { + "hide_name": 1, + "bits": [ 43 ], + "attributes": { + "src": ":260|:222" + } + }, + "$techmap$techmap$add$tests/counter.v:20$2.$auto$alumacc.cc:470:replace_alu$54.lcu.$and$:222$261_Y": { + "hide_name": 1, + "bits": [ 44 ], + "attributes": { + "src": ":260|:222" + } + }, + "clk": { + "hide_name": 0, + "bits": [ 12 ], + "attributes": { + "src": "tests/counter.v:12" + } + }, + "enable": { + "hide_name": 0, + "bits": [ 10 ], + "attributes": { + "src": "tests/counter.v:12" + } + }, + "out": { + "hide_name": 0, + "bits": [ 2, 3, 4, 5, 6, 7, 8, 9 ], + "attributes": { + "src": "tests/counter.v:11" + } + }, + "reset": { + "hide_name": 0, + "bits": [ 11 ], + "attributes": { + "src": "tests/counter.v:12" + } + } + } + } + } +} diff --git a/src/main/tests/json files/counter.json b/src/main/tests/json files/counter.json new file mode 100644 index 0000000..9cedd21 --- /dev/null +++ b/src/main/tests/json files/counter.json @@ -0,0 +1,874 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "counter": { + "ports": { + "out": { + "direction": "output", + "bits": [ 2, 3, 4, 5, 6, 7, 8, 9 ] + }, + "enable": { + "direction": "input", + "bits": [ 10 ] + }, + "reset": { + "direction": "input", + "bits": [ 11 ] + }, + "clk": { + "direction": "input", + "bits": [ 12 ] + } + }, + "cells": { + "$auto$simplemap.cc:277:simplemap_mux$57": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 13 ], + "S": [ 10 ], + "Y": [ 14 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$58": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 3 ], + "B": [ 15 ], + "S": [ 10 ], + "Y": [ 16 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$59": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 4 ], + "B": [ 17 ], + "S": [ 10 ], + "Y": [ 18 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$60": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 5 ], + "B": [ 19 ], + "S": [ 10 ], + "Y": [ 20 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$61": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ 21 ], + "S": [ 10 ], + "Y": [ 22 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$62": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "B": [ 23 ], + "S": [ 10 ], + "Y": [ 24 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$63": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 8 ], + "B": [ 25 ], + "S": [ 10 ], + "Y": [ 26 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$64": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 9 ], + "B": [ 27 ], + "S": [ 10 ], + "Y": [ 28 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$65": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 14 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 29 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$66": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 16 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 30 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$67": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 18 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 31 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$68": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 20 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 32 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$69": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 22 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 33 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$70": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 24 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 34 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$71": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 26 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 35 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$72": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 28 ], + "B": [ "0" ], + "S": [ 11 ], + "Y": [ 36 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$73": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 29 ], + "Q": [ 2 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$74": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 30 ], + "Q": [ 3 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$75": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 31 ], + "Q": [ 4 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$76": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 32 ], + "Q": [ 5 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$77": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 33 ], + "Q": [ 6 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$78": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 34 ], + "Q": [ 7 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$79": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 35 ], + "Q": [ 8 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$80": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/counter.v:15" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 12 ], + "D": [ 36 ], + "Q": [ 9 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$119": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 3 ], + "B": [ 2 ], + "Y": [ 15 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$120": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 4 ], + "B": [ 37 ], + "Y": [ 17 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$121": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 5 ], + "B": [ 38 ], + "Y": [ 19 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$122": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ 39 ], + "Y": [ 21 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$123": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "B": [ 40 ], + "Y": [ 23 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$124": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 8 ], + "B": [ 41 ], + "Y": [ 25 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$125": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":263" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 9 ], + "B": [ 42 ], + "Y": [ 27 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$489": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:221" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 3 ], + "B": [ 2 ], + "Y": [ 37 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$505": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:221" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 43 ], + "B": [ 37 ], + "Y": [ 39 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$520": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:222" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 5 ], + "B": [ 4 ], + "Y": [ 43 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$521": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:222" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "B": [ 6 ], + "Y": [ 44 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$550": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:229" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 44 ], + "B": [ 39 ], + "Y": [ 41 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$557": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:229" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 4 ], + "B": [ 37 ], + "Y": [ 38 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$558": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:229" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ 39 ], + "Y": [ 40 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$559": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": ":260|:229" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 8 ], + "B": [ 41 ], + "Y": [ 42 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$86": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": ":262" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ "1" ], + "Y": [ 13 ] + } + } + }, + "netnames": { + "$0\\out[7:0]": { + "hide_name": 1, + "bits": [ 29, 30, 31, 32, 33, 34, 35, 36 ], + "attributes": { + "src": "tests/counter.v:15" + } + }, + "$add$tests/counter.v:20$2_Y": { + "hide_name": 1, + "bits": [ 13, 15, 17, 19, 21, 23, 25, 27, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68 ], + "attributes": { + "src": "tests/counter.v:20" + } + }, + "$procmux$4_Y": { + "hide_name": 1, + "bits": [ 14, 16, 18, 20, 22, 24, 26, 28 ], + "attributes": { + } + }, + "$techmap$add$tests/counter.v:20$2.$auto$alumacc.cc:470:replace_alu$54.lcu.g": { + "hide_name": 1, + "bits": [ 69, 37, 38, 39, 40, 41, 42, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94 ], + "attributes": { + "src": ":260|:203" + } + }, + "$techmap$techmap$add$tests/counter.v:20$2.$auto$alumacc.cc:470:replace_alu$54.lcu.$and$:222$258_Y": { + "hide_name": 1, + "bits": [ 43 ], + "attributes": { + "src": ":260|:222" + } + }, + "$techmap$techmap$add$tests/counter.v:20$2.$auto$alumacc.cc:470:replace_alu$54.lcu.$and$:222$261_Y": { + "hide_name": 1, + "bits": [ 44 ], + "attributes": { + "src": ":260|:222" + } + }, + "clk": { + "hide_name": 0, + "bits": [ 12 ], + "attributes": { + "src": "tests/counter.v:12" + } + }, + "enable": { + "hide_name": 0, + "bits": [ 10 ], + "attributes": { + "src": "tests/counter.v:12" + } + }, + "out": { + "hide_name": 0, + "bits": [ 2, 3, 4, 5, 6, 7, 8, 9 ], + "attributes": { + "src": "tests/counter.v:11" + } + }, + "reset": { + "hide_name": 0, + "bits": [ 11 ], + "attributes": { + "src": "tests/counter.v:12" + } + } + } + } + } +} diff --git a/src/main/tests/json files/multiplexer.json b/src/main/tests/json files/multiplexer.json new file mode 100644 index 0000000..093b2c4 --- /dev/null +++ b/src/main/tests/json files/multiplexer.json @@ -0,0 +1,64 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "mux": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "sel": { + "direction": "input", + "bits": [ 4 ] + }, + "out": { + "direction": "output", + "bits": [ 5 ] + } + }, + "cells": { + }, + "netnames": { + "$0\\out[0:0]": { + "hide_name": 1, + "bits": [ 6 ], + "attributes": { + "src": "tests/multiplexer.v:6" + } + }, + "out": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "tests/multiplexer.v:4" + } + }, + "sel": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/multiplexer.v:3" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/multiplexer.v:3" + } + }, + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/multiplexer.v:3" + } + } + } + } + } +} diff --git a/src/main/tests/json files/or.json b/src/main/tests/json files/or.json new file mode 100644 index 0000000..5de1a87 --- /dev/null +++ b/src/main/tests/json files/or.json @@ -0,0 +1,78 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "OR": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "out": { + "direction": "output", + "bits": [ 5 ] + } + }, + "cells": { + "G1": { + "hide_name": 0, + "type": "OR", + "parameters": { + }, + "attributes": { + "src": "tests/or.v:4" + }, + "port_directions": { + "$4": "input", + "$3": "input", + "$2": "input", + "$1": "output" + }, + "connections": { + "$4": [ 4 ], + "$3": [ 3 ], + "$2": [ 2 ], + "$1": [ 5 ] + } + } + }, + "netnames": { + "out": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "tests/or.v:3" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/or.v:2" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/or.v:2" + } + }, + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/or.v:2" + } + } + } + } + } +} diff --git a/src/main/tests/json files/pattern.json b/src/main/tests/json files/pattern.json new file mode 100644 index 0000000..ad6219b --- /dev/null +++ b/src/main/tests/json files/pattern.json @@ -0,0 +1,334 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "test": { + "ports": { + "in": { + "direction": "input", + "bits": [ 2 ] + }, + "clk": { + "direction": "input", + "bits": [ 3 ] + }, + "out": { + "direction": "output", + "bits": [ 4 ] + } + }, + "cells": { + "$auto$simplemap.cc:136:simplemap_reduce$133": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 5 ], + "B": [ 6 ], + "Y": [ 7 ] + } + }, + "$auto$simplemap.cc:136:simplemap_reduce$138": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 8 ], + "B": [ 9 ], + "Y": [ 10 ] + } + }, + "$auto$simplemap.cc:136:simplemap_reduce$140": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 11 ], + "B": [ 12 ], + "Y": [ 13 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$142": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 3 ], + "D": [ 10 ], + "Q": [ 12 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$143": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 3 ], + "D": [ 7 ], + "Q": [ 14 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$144": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 3 ], + "D": [ 15 ], + "Q": [ 11 ] + } + }, + "$auto$simplemap.cc:373:simplemap_dff$146": { + "hide_name": 1, + "type": "$_DFF_P_", + "parameters": { + }, + "attributes": { + "src": "tests/test_pattern.v:47" + }, + "port_directions": { + "C": "input", + "D": "input", + "Q": "output" + }, + "connections": { + "C": [ 3 ], + "D": [ 14 ], + "Q": [ 4 ] + } + }, + "$auto$simplemap.cc:37:simplemap_not$131": { + "hide_name": 1, + "type": "$_NOT_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "Y": [ 16 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$130": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 16 ], + "B": [ 12 ], + "Y": [ 15 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$134": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 14 ], + "Y": [ 6 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$135": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 16 ], + "B": [ 14 ], + "Y": [ 9 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$136": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 16 ], + "B": [ 11 ], + "Y": [ 5 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$141": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 13 ], + "Y": [ 8 ] + } + } + }, + "netnames": { + "$auto$fsm_map.cc:102:implement_pattern_cache$68": { + "hide_name": 1, + "bits": [ 13 ], + "attributes": { + } + }, + "$auto$fsm_map.cc:118:implement_pattern_cache$64": { + "hide_name": 1, + "bits": [ 9 ], + "attributes": { + } + }, + "$auto$fsm_map.cc:118:implement_pattern_cache$70": { + "hide_name": 1, + "bits": [ 8 ], + "attributes": { + } + }, + "$auto$fsm_map.cc:118:implement_pattern_cache$75": { + "hide_name": 1, + "bits": [ 5 ], + "attributes": { + } + }, + "$auto$fsm_map.cc:118:implement_pattern_cache$79": { + "hide_name": 1, + "bits": [ 6 ], + "attributes": { + } + }, + "$auto$fsm_map.cc:118:implement_pattern_cache$84": { + "hide_name": 1, + "bits": [ 15 ], + "attributes": { + } + }, + "$auto$fsm_map.cc:170:map_fsm$58": { + "hide_name": 1, + "bits": [ 10, 7, 17 ], + "attributes": { + } + }, + "$auto$fsm_map.cc:74:implement_pattern_cache$62": { + "hide_name": 1, + "bits": [ 16 ], + "attributes": { + } + }, + "clk": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/test_pattern.v:3" + } + }, + "in": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/test_pattern.v:3" + } + }, + "out": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/test_pattern.v:4" + } + }, + "state": { + "hide_name": 0, + "bits": [ 12, 14, 11 ], + "attributes": { + "onehot": 1 + } + } + } + } + } +} diff --git a/src/main/tests/json files/test12.json b/src/main/tests/json files/test12.json new file mode 100644 index 0000000..41a35ae --- /dev/null +++ b/src/main/tests/json files/test12.json @@ -0,0 +1,287 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "test12": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "d": { + "direction": "input", + "bits": [ 5 ] + }, + "e": { + "direction": "input", + "bits": [ 6 ] + }, + "f": { + "direction": "input", + "bits": [ 7 ] + }, + "g": { + "direction": "input", + "bits": [ 8 ] + }, + "h": { + "direction": "input", + "bits": [ 9 ] + }, + "out": { + "direction": "output", + "bits": [ 10 ] + } + }, + "cells": { + "$auto$simplemap.cc:85:simplemap_bitop$52": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 3 ], + "Y": [ 11 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$53": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 11 ], + "B": [ 4 ], + "Y": [ 12 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$54": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 12 ], + "B": [ 5 ], + "Y": [ 13 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$55": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 13 ], + "B": [ 6 ], + "Y": [ 14 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$56": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 14 ], + "B": [ 7 ], + "Y": [ 15 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$57": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 15 ], + "B": [ 8 ], + "Y": [ 16 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$58": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 16 ], + "B": [ 9 ], + "Y": [ 10 ] + } + } + }, + "netnames": { + "$and$tests/Verilogfiles/test1.v:5$1_Y": { + "hide_name": 1, + "bits": [ 11 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$2_Y": { + "hide_name": 1, + "bits": [ 12 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$3_Y": { + "hide_name": 1, + "bits": [ 13 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$4_Y": { + "hide_name": 1, + "bits": [ 14 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$5_Y": { + "hide_name": 1, + "bits": [ 15 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$6_Y": { + "hide_name": 1, + "bits": [ 16 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "d": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "e": { + "hide_name": 0, + "bits": [ 6 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "f": { + "hide_name": 0, + "bits": [ 7 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "g": { + "hide_name": 0, + "bits": [ 8 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "h": { + "hide_name": 0, + "bits": [ 9 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "out": { + "hide_name": 0, + "bits": [ 10 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:4" + } + } + } + } + } +} diff --git a/src/main/tests/json files/test23.json b/src/main/tests/json files/test23.json new file mode 100644 index 0000000..cb98e8f --- /dev/null +++ b/src/main/tests/json files/test23.json @@ -0,0 +1,172 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "test": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "d": { + "direction": "input", + "bits": [ 5 ] + }, + "out": { + "direction": "output", + "bits": [ 6 ] + } + }, + "cells": { + "$auto$simplemap.cc:85:simplemap_bitop$50": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test23.v:7" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 3 ], + "Y": [ 7 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$51": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test23.v:8" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 4 ], + "B": [ 5 ], + "Y": [ 8 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$52": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test23.v:10" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "B": [ 8 ], + "Y": [ 9 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$53": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test23.v:12" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 9 ], + "B": [ 9 ], + "Y": [ 6 ] + } + } + }, + "netnames": { + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/Verilogfiles/test23.v:4" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/Verilogfiles/test23.v:4" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/Verilogfiles/test23.v:4" + } + }, + "d": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "tests/Verilogfiles/test23.v:4" + } + }, + "out": { + "hide_name": 0, + "bits": [ 6 ], + "attributes": { + "src": "tests/Verilogfiles/test23.v:5" + } + }, + "w": { + "hide_name": 0, + "bits": [ 9 ], + "attributes": { + "src": "tests/Verilogfiles/test23.v:6" + } + }, + "x": { + "hide_name": 0, + "bits": [ 7 ], + "attributes": { + "src": "tests/Verilogfiles/test23.v:6" + } + }, + "y": { + "hide_name": 0, + "bits": [ 8 ], + "attributes": { + "src": "tests/Verilogfiles/test23.v:6" + } + }, + "z": { + "hide_name": 0, + "bits": [ 9 ], + "attributes": { + "src": "tests/Verilogfiles/test23.v:6" + } + } + } + } + } +} diff --git a/src/main/tests/json files/test33.json b/src/main/tests/json files/test33.json new file mode 100644 index 0000000..d925da3 --- /dev/null +++ b/src/main/tests/json files/test33.json @@ -0,0 +1,143 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "test": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "d": { + "direction": "input", + "bits": [ 5 ] + }, + "out1": { + "direction": "output", + "bits": [ 6 ] + }, + "out2": { + "direction": "output", + "bits": [ 7 ] + } + }, + "cells": { + "$auto$simplemap.cc:85:simplemap_bitop$48": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test33.v:7" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 3 ], + "Y": [ 8 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$49": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test33.v:8" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 8 ], + "B": [ 4 ], + "Y": [ 6 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$50": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test33.v:9" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 8 ], + "B": [ 5 ], + "Y": [ 7 ] + } + } + }, + "netnames": { + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/Verilogfiles/test33.v:4" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/Verilogfiles/test33.v:4" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/Verilogfiles/test33.v:4" + } + }, + "d": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "tests/Verilogfiles/test33.v:4" + } + }, + "out1": { + "hide_name": 0, + "bits": [ 6 ], + "attributes": { + "src": "tests/Verilogfiles/test33.v:5" + } + }, + "out2": { + "hide_name": 0, + "bits": [ 7 ], + "attributes": { + "src": "tests/Verilogfiles/test33.v:5" + } + }, + "x": { + "hide_name": 0, + "bits": [ 8 ], + "attributes": { + "src": "tests/Verilogfiles/test33.v:6" + } + } + } + } + } +} diff --git a/src/main/tests/json files/testAO.json b/src/main/tests/json files/testAO.json new file mode 100644 index 0000000..a141281 --- /dev/null +++ b/src/main/tests/json files/testAO.json @@ -0,0 +1,558 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "test": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "d": { + "direction": "input", + "bits": [ 5 ] + }, + "e": { + "direction": "input", + "bits": [ 6 ] + }, + "f": { + "direction": "input", + "bits": [ 7 ] + }, + "g": { + "direction": "input", + "bits": [ 8 ] + }, + "out": { + "direction": "output", + "bits": [ 9 ] + } + }, + "cells": { + "$auto$simplemap.cc:85:simplemap_bitop$110": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/testAO.v:7" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 3 ], + "Y": [ 10 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$111": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/testAO.v:10" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 11 ], + "B": [ 12 ], + "Y": [ 13 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$112": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/testAO.v:9" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 14 ], + "B": [ 8 ], + "Y": [ 11 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$113": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/testAO.v:10" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 13 ], + "B": [ 15 ], + "Y": [ 9 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$114": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/testAO.v:10" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "B": [ 2 ], + "Y": [ 15 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$115": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/testAO.v:7" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 10 ], + "B": [ 4 ], + "Y": [ 14 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$116": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/testAO.v:8" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 14 ], + "B": [ 5 ], + "Y": [ 12 ] + } + } + }, + "netnames": { + "$and$tests/Verilogfiles/testAO.v:10$64_Y": { + "hide_name": 1, + "bits": [ 15 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:10" + } + }, + "$and$tests/Verilogfiles/testAO.v:7$59_Y": { + "hide_name": 1, + "bits": [ 10 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:7" + } + }, + "$or$tests/Verilogfiles/testAO.v:10$63_Y": { + "hide_name": 1, + "bits": [ 13 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:10" + } + }, + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:4" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:4" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:4" + } + }, + "d": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:4" + } + }, + "e": { + "hide_name": 0, + "bits": [ 6 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:4" + } + }, + "f": { + "hide_name": 0, + "bits": [ 7 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:4" + } + }, + "g": { + "hide_name": 0, + "bits": [ 8 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:4" + } + }, + "out": { + "hide_name": 0, + "bits": [ 9 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:5" + } + }, + "x": { + "hide_name": 0, + "bits": [ 14 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:6" + } + }, + "y": { + "hide_name": 0, + "bits": [ 12 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:6" + } + }, + "z": { + "hide_name": 0, + "bits": [ 11 ], + "attributes": { + "src": "tests/Verilogfiles/testAO.v:6" + } + } + } + }, + "test12": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "d": { + "direction": "input", + "bits": [ 5 ] + }, + "e": { + "direction": "input", + "bits": [ 6 ] + }, + "f": { + "direction": "input", + "bits": [ 7 ] + }, + "g": { + "direction": "input", + "bits": [ 8 ] + }, + "h": { + "direction": "input", + "bits": [ 9 ] + }, + "out": { + "direction": "output", + "bits": [ 10 ] + } + }, + "cells": { + "$auto$simplemap.cc:85:simplemap_bitop$52": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 3 ], + "Y": [ 11 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$53": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 11 ], + "B": [ 4 ], + "Y": [ 12 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$54": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 12 ], + "B": [ 5 ], + "Y": [ 13 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$55": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 13 ], + "B": [ 6 ], + "Y": [ 14 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$56": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 14 ], + "B": [ 7 ], + "Y": [ 15 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$57": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 15 ], + "B": [ 8 ], + "Y": [ 16 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$58": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 16 ], + "B": [ 9 ], + "Y": [ 10 ] + } + } + }, + "netnames": { + "$and$tests/Verilogfiles/test1.v:5$1_Y": { + "hide_name": 1, + "bits": [ 11 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$2_Y": { + "hide_name": 1, + "bits": [ 12 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$3_Y": { + "hide_name": 1, + "bits": [ 13 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$4_Y": { + "hide_name": 1, + "bits": [ 14 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$5_Y": { + "hide_name": 1, + "bits": [ 15 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "$and$tests/Verilogfiles/test1.v:5$6_Y": { + "hide_name": 1, + "bits": [ 16 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:5" + } + }, + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "d": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "e": { + "hide_name": 0, + "bits": [ 6 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "f": { + "hide_name": 0, + "bits": [ 7 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "g": { + "hide_name": 0, + "bits": [ 8 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "h": { + "hide_name": 0, + "bits": [ 9 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:3" + } + }, + "out": { + "hide_name": 0, + "bits": [ 10 ], + "attributes": { + "src": "tests/Verilogfiles/test1.v:4" + } + } + } + } + } +} diff --git a/src/main/tests/json files/testMajority.json b/src/main/tests/json files/testMajority.json new file mode 100644 index 0000000..f360d9b --- /dev/null +++ b/src/main/tests/json files/testMajority.json @@ -0,0 +1,212 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "testMajority": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "d": { + "direction": "output", + "bits": [ 5 ] + } + }, + "cells": { + "$or$tests/testMajority.v:5$5": { + "hide_name": 1, + "type": "$or", + "parameters": { + "Y_WIDTH": 1, + "B_WIDTH": 1, + "A_WIDTH": 1, + "B_SIGNED": 0, + "A_SIGNED": 0 + }, + "attributes": { + "src": "tests/testMajority.v:5" + }, + "port_directions": { + "Y": "output", + "B": "input", + "A": "input" + }, + "connections": { + "Y": [ 5 ], + "B": [ 6 ], + "A": [ 7 ] + } + }, + "$and$tests/testMajority.v:5$4": { + "hide_name": 1, + "type": "$and", + "parameters": { + "Y_WIDTH": 1, + "B_WIDTH": 1, + "A_WIDTH": 1, + "B_SIGNED": 0, + "A_SIGNED": 0 + }, + "attributes": { + "src": "tests/testMajority.v:5" + }, + "port_directions": { + "Y": "output", + "B": "input", + "A": "input" + }, + "connections": { + "Y": [ 6 ], + "B": [ 4 ], + "A": [ 3 ] + } + }, + "$or$tests/testMajority.v:5$3": { + "hide_name": 1, + "type": "$or", + "parameters": { + "Y_WIDTH": 1, + "B_WIDTH": 1, + "A_WIDTH": 1, + "B_SIGNED": 0, + "A_SIGNED": 0 + }, + "attributes": { + "src": "tests/testMajority.v:5" + }, + "port_directions": { + "Y": "output", + "B": "input", + "A": "input" + }, + "connections": { + "Y": [ 7 ], + "B": [ 8 ], + "A": [ 9 ] + } + }, + "$and$tests/testMajority.v:5$2": { + "hide_name": 1, + "type": "$and", + "parameters": { + "Y_WIDTH": 1, + "B_WIDTH": 1, + "A_WIDTH": 1, + "B_SIGNED": 0, + "A_SIGNED": 0 + }, + "attributes": { + "src": "tests/testMajority.v:5" + }, + "port_directions": { + "Y": "output", + "B": "input", + "A": "input" + }, + "connections": { + "Y": [ 8 ], + "B": [ 3 ], + "A": [ 2 ] + } + }, + "$and$tests/testMajority.v:5$1": { + "hide_name": 1, + "type": "$and", + "parameters": { + "Y_WIDTH": 1, + "B_WIDTH": 1, + "A_WIDTH": 1, + "B_SIGNED": 0, + "A_SIGNED": 0 + }, + "attributes": { + "src": "tests/testMajority.v:5" + }, + "port_directions": { + "Y": "output", + "B": "input", + "A": "input" + }, + "connections": { + "Y": [ 9 ], + "B": [ 4 ], + "A": [ 2 ] + } + } + }, + "netnames": { + "$or$tests/testMajority.v:5$5_Y": { + "hide_name": 1, + "bits": [ 5 ], + "attributes": { + "src": "tests/testMajority.v:5" + } + }, + "$and$tests/testMajority.v:5$4_Y": { + "hide_name": 1, + "bits": [ 6 ], + "attributes": { + "src": "tests/testMajority.v:5" + } + }, + "$or$tests/testMajority.v:5$3_Y": { + "hide_name": 1, + "bits": [ 7 ], + "attributes": { + "src": "tests/testMajority.v:5" + } + }, + "$and$tests/testMajority.v:5$2_Y": { + "hide_name": 1, + "bits": [ 8 ], + "attributes": { + "src": "tests/testMajority.v:5" + } + }, + "$and$tests/testMajority.v:5$1_Y": { + "hide_name": 1, + "bits": [ 9 ], + "attributes": { + "src": "tests/testMajority.v:5" + } + }, + "d": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "tests/testMajority.v:3" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "tests/testMajority.v:2" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "tests/testMajority.v:2" + } + }, + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "tests/testMajority.v:2" + } + } + } + } + } +} diff --git a/src/main/tests/json files/test_arrays.json b/src/main/tests/json files/test_arrays.json new file mode 100644 index 0000000..c463429 --- /dev/null +++ b/src/main/tests/json files/test_arrays.json @@ -0,0 +1,73 @@ +{ + "creator": "Yosys 0.6 (git sha1 5869d26, i686-pc-mingw32-gcc 4.8.1 -Os)", + "modules": { + "test": { + "ports": { + "a": { + "direction": "input", + "bits": [ 2, 3, 4, 5 ] + }, + "b": { + "direction": "output", + "bits": [ 6, 7 ] + } + }, + "cells": { + "$auto$simplemap.cc:85:simplemap_bitop$47": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test_arrays.v:5" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 4 ], + "Y": [ 6 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$48": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "tests/Verilogfiles/test_arrays.v:6" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 3 ], + "B": [ 5 ], + "Y": [ 7 ] + } + } + }, + "netnames": { + "a": { + "hide_name": 0, + "bits": [ 2, 3, 4, 5 ], + "attributes": { + "src": "tests/Verilogfiles/test_arrays.v:3" + } + }, + "b": { + "hide_name": 0, + "bits": [ 6, 7 ], + "attributes": { + "src": "tests/Verilogfiles/test_arrays.v:4" + } + } + } + } + } +} diff --git a/verilog/mac/autoyosys/auto.ysy b/verilog/mac/autoyosys/auto.ysy new file mode 100644 index 0000000..d3d042f --- /dev/null +++ b/verilog/mac/autoyosys/auto.ysy @@ -0,0 +1,5 @@ +read_verilog ./autoyosys/tmp.v +hierarchy -check +proc; opt; fsm; opt; memory; opt +techmap; opt +json -o ./autoyosys/tmp.json diff --git a/verilog/mac/autoyosys/tmp.json b/verilog/mac/autoyosys/tmp.json new file mode 100644 index 0000000..e11d520 --- /dev/null +++ b/verilog/mac/autoyosys/tmp.json @@ -0,0 +1,420 @@ +{ + "creator": "Yosys 0.7 (git sha1 61f6811, gcc 5.4.0-6ubuntu1~16.04.4 -O2 -fstack-protector-strong -fPIC -Os)", + "modules": { + "multiplexer4_1": { + "attributes": { + "src": "./autoyosys/tmp.v:1" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "d": { + "direction": "input", + "bits": [ 5 ] + }, + "x": { + "direction": "input", + "bits": [ 6 ] + }, + "y": { + "direction": "input", + "bits": [ 7 ] + }, + "dout": { + "direction": "output", + "bits": [ 8 ] + } + }, + "cells": { + "$auto$simplemap.cc:37:simplemap_not$62": { + "hide_name": 1, + "type": "$_NOT_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:13" + }, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "Y": [ 9 ] + } + }, + "$auto$simplemap.cc:37:simplemap_not$67": { + "hide_name": 1, + "type": "$_NOT_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:14" + }, + "port_directions": { + "A": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "Y": [ 10 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$60": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:12" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 9 ], + "Y": [ 11 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$61": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:12" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 11 ], + "B": [ 10 ], + "Y": [ 12 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$63": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:13" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 3 ], + "B": [ 9 ], + "Y": [ 13 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$64": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:13" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 13 ], + "B": [ 7 ], + "Y": [ 14 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$65": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:13" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 12 ], + "B": [ 14 ], + "Y": [ 15 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$66": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:14" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 4 ], + "B": [ 6 ], + "Y": [ 16 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$68": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:14" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 16 ], + "B": [ 10 ], + "Y": [ 17 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$69": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:14" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 15 ], + "B": [ 17 ], + "Y": [ 18 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$70": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:15" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 5 ], + "B": [ 6 ], + "Y": [ 19 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$71": { + "hide_name": 1, + "type": "$_AND_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:15" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 19 ], + "B": [ 7 ], + "Y": [ 20 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$72": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "./autoyosys/tmp.v:15" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 18 ], + "B": [ 20 ], + "Y": [ 8 ] + } + } + }, + "netnames": { + "$and$./autoyosys/tmp.v:12$2_Y": { + "hide_name": 1, + "bits": [ 11 ], + "attributes": { + "src": "./autoyosys/tmp.v:12" + } + }, + "$and$./autoyosys/tmp.v:12$4_Y": { + "hide_name": 1, + "bits": [ 12 ], + "attributes": { + "src": "./autoyosys/tmp.v:12" + } + }, + "$and$./autoyosys/tmp.v:13$6_Y": { + "hide_name": 1, + "bits": [ 13 ], + "attributes": { + "src": "./autoyosys/tmp.v:13" + } + }, + "$and$./autoyosys/tmp.v:13$7_Y": { + "hide_name": 1, + "bits": [ 14 ], + "attributes": { + "src": "./autoyosys/tmp.v:13" + } + }, + "$and$./autoyosys/tmp.v:14$11_Y": { + "hide_name": 1, + "bits": [ 17 ], + "attributes": { + "src": "./autoyosys/tmp.v:14" + } + }, + "$and$./autoyosys/tmp.v:14$9_Y": { + "hide_name": 1, + "bits": [ 16 ], + "attributes": { + "src": "./autoyosys/tmp.v:14" + } + }, + "$and$./autoyosys/tmp.v:15$13_Y": { + "hide_name": 1, + "bits": [ 19 ], + "attributes": { + "src": "./autoyosys/tmp.v:15" + } + }, + "$and$./autoyosys/tmp.v:15$14_Y": { + "hide_name": 1, + "bits": [ 20 ], + "attributes": { + "src": "./autoyosys/tmp.v:15" + } + }, + "$not$./autoyosys/tmp.v:12$1_Y": { + "hide_name": 1, + "bits": [ 9 ], + "attributes": { + "src": "./autoyosys/tmp.v:12" + } + }, + "$not$./autoyosys/tmp.v:12$3_Y": { + "hide_name": 1, + "bits": [ 10 ], + "attributes": { + "src": "./autoyosys/tmp.v:12" + } + }, + "$or$./autoyosys/tmp.v:13$8_Y": { + "hide_name": 1, + "bits": [ 15 ], + "attributes": { + "src": "./autoyosys/tmp.v:13" + } + }, + "$or$./autoyosys/tmp.v:14$12_Y": { + "hide_name": 1, + "bits": [ 18 ], + "attributes": { + "src": "./autoyosys/tmp.v:14" + } + }, + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "./autoyosys/tmp.v:5" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "./autoyosys/tmp.v:6" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "./autoyosys/tmp.v:7" + } + }, + "d": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "./autoyosys/tmp.v:8" + } + }, + "dout": { + "hide_name": 0, + "bits": [ 8 ], + "attributes": { + "src": "./autoyosys/tmp.v:3" + } + }, + "x": { + "hide_name": 0, + "bits": [ 6 ], + "attributes": { + "src": "./autoyosys/tmp.v:9" + } + }, + "y": { + "hide_name": 0, + "bits": [ 7 ], + "attributes": { + "src": "./autoyosys/tmp.v:10" + } + } + } + } + } +} diff --git a/verilog/mac/autoyosys/tmp.v b/verilog/mac/autoyosys/tmp.v new file mode 100644 index 0000000..d51d442 --- /dev/null +++ b/verilog/mac/autoyosys/tmp.v @@ -0,0 +1,17 @@ +module multiplexer4_1 ( a ,b ,c ,d ,x ,y ,dout ); + +output dout ; + +input a ; +input b ; +input c ; +input d ; +input x ; +input y ; + +assign dout = (a & (~x) & (~y)) | + (b & (~x) & (y)) | + (c & x & (~y)) | + (d & x & y); + +endmodule diff --git a/verilog/mac/synth.sh b/verilog/mac/synth.sh new file mode 100644 index 0000000..99536da --- /dev/null +++ b/verilog/mac/synth.sh @@ -0,0 +1,10 @@ +#!/bin/bash +if [ $# -eq 0 ] + then + echo "No file specified, call this script using this syntax:" + echo "\"$ ./synth.sh \"" + else + cp $1 ./autoyosys/tmp.v + yosys -s ./autoyosys/auto.ysy + cp ./autoyosys/tmp.json ./$1.json +fi diff --git a/verilog/windows/autoyosys/auto.ysy b/verilog/windows/autoyosys/auto.ysy new file mode 100644 index 0000000..fb14995 --- /dev/null +++ b/verilog/windows/autoyosys/auto.ysy @@ -0,0 +1,5 @@ +read_verilog autoyosys\tmp.v +hierarchy -check +proc; opt; fsm; opt; memory; opt +techmap; opt +json -o autoyosys\tmp.json diff --git a/verilog/windows/autoyosys/pthreadVC2.dll b/verilog/windows/autoyosys/pthreadVC2.dll new file mode 100644 index 0000000000000000000000000000000000000000..93f562baa916c6a5aac9aa753069399e081b17ce GIT binary patch literal 86070 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 + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +(* techmap_celltype = "$alu" *) +module _80_ice40_alu (A, B, CI, BI, X, Y, CO); + parameter A_SIGNED = 0; + parameter B_SIGNED = 0; + parameter A_WIDTH = 1; + parameter B_WIDTH = 1; + parameter Y_WIDTH = 1; + + input [A_WIDTH-1:0] A; + input [B_WIDTH-1:0] B; + output [Y_WIDTH-1:0] X, Y; + + input CI, BI; + output [Y_WIDTH-1:0] CO; + + wire _TECHMAP_FAIL_ = Y_WIDTH <= 2; + + wire [Y_WIDTH-1:0] A_buf, B_buf; + \$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf)); + \$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf)); + + wire [Y_WIDTH-1:0] AA = A_buf; + wire [Y_WIDTH-1:0] BB = BI ? ~B_buf : B_buf; + wire [Y_WIDTH-1:0] C = {CO, CI}; + + genvar i; + generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice + SB_CARRY carry ( + .I0(AA[i]), + .I1(BB[i]), + .CI(C[i]), + .CO(CO[i]) + ); + SB_LUT4 #( + // I0: 1010 1010 1010 1010 + // I1: 1100 1100 1100 1100 + // I2: 1111 0000 1111 0000 + // I3: 1111 1111 0000 0000 + .LUT_INIT(16'b 0110_1001_1001_0110) + ) adder ( + .I0(1'b0), + .I1(AA[i]), + .I2(BB[i]), + .I3(C[i]), + .O(Y[i]) + ); + end endgenerate + + assign X = AA ^ BB; +endmodule + diff --git a/verilog/windows/autoyosys/share/ice40/brams.txt b/verilog/windows/autoyosys/share/ice40/brams.txt new file mode 100644 index 0000000..03d5961 --- /dev/null +++ b/verilog/windows/autoyosys/share/ice40/brams.txt @@ -0,0 +1,40 @@ +bram $__ICE40_RAM4K_M0 + init 1 + abits 8 + dbits 16 + groups 2 + ports 1 1 + wrmode 0 1 + enable 1 16 + transp 0 0 + clocks 2 3 + clkpol 2 3 +endbram + +bram $__ICE40_RAM4K_M123 + init 1 + abits 9 @M1 + dbits 8 @M1 + abits 10 @M2 + dbits 4 @M2 + abits 11 @M3 + dbits 2 @M3 + groups 2 + ports 1 1 + wrmode 0 1 + enable 1 1 + transp 0 0 + clocks 2 3 + clkpol 2 3 +endbram + +match $__ICE40_RAM4K_M0 + min efficiency 2 + make_transp + or_next_if_better +endmatch + +match $__ICE40_RAM4K_M123 + min efficiency 2 + make_transp +endmatch diff --git a/verilog/windows/autoyosys/share/ice40/brams_init1.vh b/verilog/windows/autoyosys/share/ice40/brams_init1.vh new file mode 100644 index 0000000..7f9266a --- /dev/null +++ b/verilog/windows/autoyosys/share/ice40/brams_init1.vh @@ -0,0 +1,544 @@ +localparam [255:0] INIT_0 = { + INIT[2175], INIT[ 127], INIT[2174], INIT[ 126], INIT[2173], INIT[ 125], INIT[2172], INIT[ 124], + INIT[2171], INIT[ 123], INIT[2170], INIT[ 122], INIT[2169], INIT[ 121], INIT[2168], INIT[ 120], + INIT[2167], INIT[ 119], INIT[2166], INIT[ 118], INIT[2165], INIT[ 117], INIT[2164], INIT[ 116], + INIT[2163], INIT[ 115], INIT[2162], INIT[ 114], INIT[2161], INIT[ 113], INIT[2160], INIT[ 112], + INIT[2159], INIT[ 111], INIT[2158], INIT[ 110], INIT[2157], INIT[ 109], INIT[2156], INIT[ 108], + INIT[2155], INIT[ 107], INIT[2154], INIT[ 106], INIT[2153], INIT[ 105], INIT[2152], INIT[ 104], + INIT[2151], INIT[ 103], INIT[2150], INIT[ 102], INIT[2149], INIT[ 101], INIT[2148], INIT[ 100], + INIT[2147], INIT[ 99], INIT[2146], INIT[ 98], INIT[2145], INIT[ 97], INIT[2144], INIT[ 96], + INIT[2143], INIT[ 95], INIT[2142], INIT[ 94], INIT[2141], INIT[ 93], INIT[2140], INIT[ 92], + INIT[2139], INIT[ 91], INIT[2138], INIT[ 90], INIT[2137], INIT[ 89], INIT[2136], INIT[ 88], + INIT[2135], INIT[ 87], INIT[2134], INIT[ 86], INIT[2133], INIT[ 85], INIT[2132], INIT[ 84], + INIT[2131], INIT[ 83], INIT[2130], INIT[ 82], INIT[2129], INIT[ 81], INIT[2128], INIT[ 80], + INIT[2127], INIT[ 79], INIT[2126], INIT[ 78], INIT[2125], INIT[ 77], INIT[2124], INIT[ 76], + INIT[2123], INIT[ 75], INIT[2122], INIT[ 74], INIT[2121], INIT[ 73], INIT[2120], INIT[ 72], + INIT[2119], INIT[ 71], INIT[2118], INIT[ 70], INIT[2117], INIT[ 69], INIT[2116], INIT[ 68], + INIT[2115], INIT[ 67], INIT[2114], INIT[ 66], INIT[2113], INIT[ 65], INIT[2112], INIT[ 64], + INIT[2111], INIT[ 63], INIT[2110], INIT[ 62], INIT[2109], INIT[ 61], INIT[2108], INIT[ 60], + INIT[2107], INIT[ 59], INIT[2106], INIT[ 58], INIT[2105], INIT[ 57], INIT[2104], INIT[ 56], + INIT[2103], INIT[ 55], INIT[2102], INIT[ 54], INIT[2101], INIT[ 53], INIT[2100], INIT[ 52], + INIT[2099], INIT[ 51], INIT[2098], INIT[ 50], INIT[2097], INIT[ 49], INIT[2096], INIT[ 48], + INIT[2095], INIT[ 47], INIT[2094], INIT[ 46], INIT[2093], INIT[ 45], INIT[2092], INIT[ 44], + INIT[2091], INIT[ 43], INIT[2090], INIT[ 42], INIT[2089], INIT[ 41], INIT[2088], INIT[ 40], + INIT[2087], INIT[ 39], INIT[2086], INIT[ 38], INIT[2085], INIT[ 37], INIT[2084], INIT[ 36], + INIT[2083], INIT[ 35], INIT[2082], INIT[ 34], INIT[2081], INIT[ 33], INIT[2080], INIT[ 32], + INIT[2079], INIT[ 31], INIT[2078], INIT[ 30], INIT[2077], INIT[ 29], INIT[2076], INIT[ 28], + INIT[2075], INIT[ 27], INIT[2074], INIT[ 26], INIT[2073], INIT[ 25], INIT[2072], INIT[ 24], + INIT[2071], INIT[ 23], INIT[2070], INIT[ 22], INIT[2069], INIT[ 21], INIT[2068], INIT[ 20], + INIT[2067], INIT[ 19], INIT[2066], INIT[ 18], INIT[2065], INIT[ 17], INIT[2064], INIT[ 16], + INIT[2063], INIT[ 15], INIT[2062], INIT[ 14], INIT[2061], INIT[ 13], INIT[2060], INIT[ 12], + INIT[2059], INIT[ 11], INIT[2058], INIT[ 10], INIT[2057], INIT[ 9], INIT[2056], INIT[ 8], + INIT[2055], INIT[ 7], INIT[2054], INIT[ 6], INIT[2053], INIT[ 5], INIT[2052], INIT[ 4], + INIT[2051], INIT[ 3], INIT[2050], INIT[ 2], INIT[2049], INIT[ 1], INIT[2048], INIT[ 0] +}; +localparam [255:0] INIT_1 = { + INIT[2303], INIT[ 255], INIT[2302], INIT[ 254], INIT[2301], INIT[ 253], INIT[2300], INIT[ 252], + INIT[2299], INIT[ 251], INIT[2298], INIT[ 250], INIT[2297], INIT[ 249], INIT[2296], INIT[ 248], + INIT[2295], INIT[ 247], INIT[2294], INIT[ 246], INIT[2293], INIT[ 245], INIT[2292], INIT[ 244], + INIT[2291], INIT[ 243], INIT[2290], INIT[ 242], INIT[2289], INIT[ 241], INIT[2288], INIT[ 240], + INIT[2287], INIT[ 239], INIT[2286], INIT[ 238], INIT[2285], INIT[ 237], INIT[2284], INIT[ 236], + INIT[2283], INIT[ 235], INIT[2282], INIT[ 234], INIT[2281], INIT[ 233], INIT[2280], INIT[ 232], + INIT[2279], INIT[ 231], INIT[2278], INIT[ 230], INIT[2277], INIT[ 229], INIT[2276], INIT[ 228], + INIT[2275], INIT[ 227], INIT[2274], INIT[ 226], INIT[2273], INIT[ 225], INIT[2272], INIT[ 224], + INIT[2271], INIT[ 223], INIT[2270], INIT[ 222], INIT[2269], INIT[ 221], INIT[2268], INIT[ 220], + INIT[2267], INIT[ 219], INIT[2266], INIT[ 218], INIT[2265], INIT[ 217], INIT[2264], INIT[ 216], + INIT[2263], INIT[ 215], INIT[2262], INIT[ 214], INIT[2261], INIT[ 213], INIT[2260], INIT[ 212], + INIT[2259], INIT[ 211], INIT[2258], INIT[ 210], INIT[2257], INIT[ 209], INIT[2256], INIT[ 208], + INIT[2255], INIT[ 207], INIT[2254], INIT[ 206], INIT[2253], INIT[ 205], INIT[2252], INIT[ 204], + INIT[2251], INIT[ 203], INIT[2250], INIT[ 202], INIT[2249], INIT[ 201], INIT[2248], INIT[ 200], + INIT[2247], INIT[ 199], INIT[2246], INIT[ 198], INIT[2245], INIT[ 197], INIT[2244], INIT[ 196], + INIT[2243], INIT[ 195], INIT[2242], INIT[ 194], INIT[2241], INIT[ 193], INIT[2240], INIT[ 192], + INIT[2239], INIT[ 191], INIT[2238], INIT[ 190], INIT[2237], INIT[ 189], INIT[2236], INIT[ 188], + INIT[2235], INIT[ 187], INIT[2234], INIT[ 186], INIT[2233], INIT[ 185], INIT[2232], INIT[ 184], + INIT[2231], INIT[ 183], INIT[2230], INIT[ 182], INIT[2229], INIT[ 181], INIT[2228], INIT[ 180], + INIT[2227], INIT[ 179], INIT[2226], INIT[ 178], INIT[2225], INIT[ 177], INIT[2224], INIT[ 176], + INIT[2223], INIT[ 175], INIT[2222], INIT[ 174], INIT[2221], INIT[ 173], INIT[2220], INIT[ 172], + INIT[2219], INIT[ 171], INIT[2218], INIT[ 170], INIT[2217], INIT[ 169], INIT[2216], INIT[ 168], + INIT[2215], INIT[ 167], INIT[2214], INIT[ 166], INIT[2213], INIT[ 165], INIT[2212], INIT[ 164], + INIT[2211], INIT[ 163], INIT[2210], INIT[ 162], INIT[2209], INIT[ 161], INIT[2208], INIT[ 160], + INIT[2207], INIT[ 159], INIT[2206], INIT[ 158], INIT[2205], INIT[ 157], INIT[2204], INIT[ 156], + INIT[2203], INIT[ 155], INIT[2202], INIT[ 154], INIT[2201], INIT[ 153], INIT[2200], INIT[ 152], + INIT[2199], INIT[ 151], INIT[2198], INIT[ 150], INIT[2197], INIT[ 149], INIT[2196], INIT[ 148], + INIT[2195], INIT[ 147], INIT[2194], INIT[ 146], INIT[2193], INIT[ 145], INIT[2192], INIT[ 144], + INIT[2191], INIT[ 143], INIT[2190], INIT[ 142], INIT[2189], INIT[ 141], INIT[2188], INIT[ 140], + INIT[2187], INIT[ 139], INIT[2186], INIT[ 138], INIT[2185], INIT[ 137], INIT[2184], INIT[ 136], + INIT[2183], INIT[ 135], INIT[2182], INIT[ 134], INIT[2181], INIT[ 133], INIT[2180], INIT[ 132], + INIT[2179], INIT[ 131], INIT[2178], INIT[ 130], INIT[2177], INIT[ 129], INIT[2176], INIT[ 128] +}; +localparam [255:0] INIT_2 = { + INIT[2431], INIT[ 383], INIT[2430], INIT[ 382], INIT[2429], INIT[ 381], INIT[2428], INIT[ 380], + INIT[2427], INIT[ 379], INIT[2426], INIT[ 378], INIT[2425], INIT[ 377], INIT[2424], INIT[ 376], + INIT[2423], INIT[ 375], INIT[2422], INIT[ 374], INIT[2421], INIT[ 373], INIT[2420], INIT[ 372], + INIT[2419], INIT[ 371], INIT[2418], INIT[ 370], INIT[2417], INIT[ 369], INIT[2416], INIT[ 368], + INIT[2415], INIT[ 367], INIT[2414], INIT[ 366], INIT[2413], INIT[ 365], INIT[2412], INIT[ 364], + INIT[2411], INIT[ 363], INIT[2410], INIT[ 362], INIT[2409], INIT[ 361], INIT[2408], INIT[ 360], + INIT[2407], INIT[ 359], INIT[2406], INIT[ 358], INIT[2405], INIT[ 357], INIT[2404], INIT[ 356], + INIT[2403], INIT[ 355], INIT[2402], INIT[ 354], INIT[2401], INIT[ 353], INIT[2400], INIT[ 352], + INIT[2399], INIT[ 351], INIT[2398], INIT[ 350], INIT[2397], INIT[ 349], INIT[2396], INIT[ 348], + INIT[2395], INIT[ 347], INIT[2394], INIT[ 346], INIT[2393], INIT[ 345], INIT[2392], INIT[ 344], + INIT[2391], INIT[ 343], INIT[2390], INIT[ 342], INIT[2389], INIT[ 341], INIT[2388], INIT[ 340], + INIT[2387], INIT[ 339], INIT[2386], INIT[ 338], INIT[2385], INIT[ 337], INIT[2384], INIT[ 336], + INIT[2383], INIT[ 335], INIT[2382], INIT[ 334], INIT[2381], INIT[ 333], INIT[2380], INIT[ 332], + INIT[2379], INIT[ 331], INIT[2378], INIT[ 330], INIT[2377], INIT[ 329], INIT[2376], INIT[ 328], + INIT[2375], INIT[ 327], INIT[2374], INIT[ 326], INIT[2373], INIT[ 325], INIT[2372], INIT[ 324], + INIT[2371], INIT[ 323], INIT[2370], INIT[ 322], INIT[2369], INIT[ 321], INIT[2368], INIT[ 320], + INIT[2367], INIT[ 319], INIT[2366], INIT[ 318], INIT[2365], INIT[ 317], INIT[2364], INIT[ 316], + INIT[2363], INIT[ 315], INIT[2362], INIT[ 314], INIT[2361], INIT[ 313], INIT[2360], INIT[ 312], + INIT[2359], INIT[ 311], INIT[2358], INIT[ 310], INIT[2357], INIT[ 309], INIT[2356], INIT[ 308], + INIT[2355], INIT[ 307], INIT[2354], INIT[ 306], INIT[2353], INIT[ 305], INIT[2352], INIT[ 304], + INIT[2351], INIT[ 303], INIT[2350], INIT[ 302], INIT[2349], INIT[ 301], INIT[2348], INIT[ 300], + INIT[2347], INIT[ 299], INIT[2346], INIT[ 298], INIT[2345], INIT[ 297], INIT[2344], INIT[ 296], + INIT[2343], INIT[ 295], INIT[2342], INIT[ 294], INIT[2341], INIT[ 293], INIT[2340], INIT[ 292], + INIT[2339], INIT[ 291], INIT[2338], INIT[ 290], INIT[2337], INIT[ 289], INIT[2336], INIT[ 288], + INIT[2335], INIT[ 287], INIT[2334], INIT[ 286], INIT[2333], INIT[ 285], INIT[2332], INIT[ 284], + INIT[2331], INIT[ 283], INIT[2330], INIT[ 282], INIT[2329], INIT[ 281], INIT[2328], INIT[ 280], + INIT[2327], INIT[ 279], INIT[2326], INIT[ 278], INIT[2325], INIT[ 277], INIT[2324], INIT[ 276], + INIT[2323], INIT[ 275], INIT[2322], INIT[ 274], INIT[2321], INIT[ 273], INIT[2320], INIT[ 272], + INIT[2319], INIT[ 271], INIT[2318], INIT[ 270], INIT[2317], INIT[ 269], INIT[2316], INIT[ 268], + INIT[2315], INIT[ 267], INIT[2314], INIT[ 266], INIT[2313], INIT[ 265], INIT[2312], INIT[ 264], + INIT[2311], INIT[ 263], INIT[2310], INIT[ 262], INIT[2309], INIT[ 261], INIT[2308], INIT[ 260], + INIT[2307], INIT[ 259], INIT[2306], INIT[ 258], INIT[2305], INIT[ 257], INIT[2304], INIT[ 256] +}; +localparam [255:0] INIT_3 = { + INIT[2559], INIT[ 511], INIT[2558], INIT[ 510], INIT[2557], INIT[ 509], INIT[2556], INIT[ 508], + INIT[2555], INIT[ 507], INIT[2554], INIT[ 506], INIT[2553], INIT[ 505], INIT[2552], INIT[ 504], + INIT[2551], INIT[ 503], INIT[2550], INIT[ 502], INIT[2549], INIT[ 501], INIT[2548], INIT[ 500], + INIT[2547], INIT[ 499], INIT[2546], INIT[ 498], INIT[2545], INIT[ 497], INIT[2544], INIT[ 496], + INIT[2543], INIT[ 495], INIT[2542], INIT[ 494], INIT[2541], INIT[ 493], INIT[2540], INIT[ 492], + INIT[2539], INIT[ 491], INIT[2538], INIT[ 490], INIT[2537], INIT[ 489], INIT[2536], INIT[ 488], + INIT[2535], INIT[ 487], INIT[2534], INIT[ 486], INIT[2533], INIT[ 485], INIT[2532], INIT[ 484], + INIT[2531], INIT[ 483], INIT[2530], INIT[ 482], INIT[2529], INIT[ 481], INIT[2528], INIT[ 480], + INIT[2527], INIT[ 479], INIT[2526], INIT[ 478], INIT[2525], INIT[ 477], INIT[2524], INIT[ 476], + INIT[2523], INIT[ 475], INIT[2522], INIT[ 474], INIT[2521], INIT[ 473], INIT[2520], INIT[ 472], + INIT[2519], INIT[ 471], INIT[2518], INIT[ 470], INIT[2517], INIT[ 469], INIT[2516], INIT[ 468], + INIT[2515], INIT[ 467], INIT[2514], INIT[ 466], INIT[2513], INIT[ 465], INIT[2512], INIT[ 464], + INIT[2511], INIT[ 463], INIT[2510], INIT[ 462], INIT[2509], INIT[ 461], INIT[2508], INIT[ 460], + INIT[2507], INIT[ 459], INIT[2506], INIT[ 458], INIT[2505], INIT[ 457], INIT[2504], INIT[ 456], + INIT[2503], INIT[ 455], INIT[2502], INIT[ 454], INIT[2501], INIT[ 453], INIT[2500], INIT[ 452], + INIT[2499], INIT[ 451], INIT[2498], INIT[ 450], INIT[2497], INIT[ 449], INIT[2496], INIT[ 448], + INIT[2495], INIT[ 447], INIT[2494], INIT[ 446], INIT[2493], INIT[ 445], INIT[2492], INIT[ 444], + INIT[2491], INIT[ 443], INIT[2490], INIT[ 442], INIT[2489], INIT[ 441], INIT[2488], INIT[ 440], + INIT[2487], INIT[ 439], INIT[2486], INIT[ 438], INIT[2485], INIT[ 437], INIT[2484], INIT[ 436], + INIT[2483], INIT[ 435], INIT[2482], INIT[ 434], INIT[2481], INIT[ 433], INIT[2480], INIT[ 432], + INIT[2479], INIT[ 431], INIT[2478], INIT[ 430], INIT[2477], INIT[ 429], INIT[2476], INIT[ 428], + INIT[2475], INIT[ 427], INIT[2474], INIT[ 426], INIT[2473], INIT[ 425], INIT[2472], INIT[ 424], + INIT[2471], INIT[ 423], INIT[2470], INIT[ 422], INIT[2469], INIT[ 421], INIT[2468], INIT[ 420], + INIT[2467], INIT[ 419], INIT[2466], INIT[ 418], INIT[2465], INIT[ 417], INIT[2464], INIT[ 416], + INIT[2463], INIT[ 415], INIT[2462], INIT[ 414], INIT[2461], INIT[ 413], INIT[2460], INIT[ 412], + INIT[2459], INIT[ 411], INIT[2458], INIT[ 410], INIT[2457], INIT[ 409], INIT[2456], INIT[ 408], + INIT[2455], INIT[ 407], INIT[2454], INIT[ 406], INIT[2453], INIT[ 405], INIT[2452], INIT[ 404], + INIT[2451], INIT[ 403], INIT[2450], INIT[ 402], INIT[2449], INIT[ 401], INIT[2448], INIT[ 400], + INIT[2447], INIT[ 399], INIT[2446], INIT[ 398], INIT[2445], INIT[ 397], INIT[2444], INIT[ 396], + INIT[2443], INIT[ 395], INIT[2442], INIT[ 394], INIT[2441], INIT[ 393], INIT[2440], INIT[ 392], + INIT[2439], INIT[ 391], INIT[2438], INIT[ 390], INIT[2437], INIT[ 389], INIT[2436], INIT[ 388], + INIT[2435], INIT[ 387], INIT[2434], INIT[ 386], INIT[2433], INIT[ 385], INIT[2432], INIT[ 384] +}; +localparam [255:0] INIT_4 = { + INIT[2687], INIT[ 639], INIT[2686], INIT[ 638], INIT[2685], INIT[ 637], INIT[2684], INIT[ 636], + INIT[2683], INIT[ 635], INIT[2682], INIT[ 634], INIT[2681], INIT[ 633], INIT[2680], INIT[ 632], + INIT[2679], INIT[ 631], INIT[2678], INIT[ 630], INIT[2677], INIT[ 629], INIT[2676], INIT[ 628], + INIT[2675], INIT[ 627], INIT[2674], INIT[ 626], INIT[2673], INIT[ 625], INIT[2672], INIT[ 624], + INIT[2671], INIT[ 623], INIT[2670], INIT[ 622], INIT[2669], INIT[ 621], INIT[2668], INIT[ 620], + INIT[2667], INIT[ 619], INIT[2666], INIT[ 618], INIT[2665], INIT[ 617], INIT[2664], INIT[ 616], + INIT[2663], INIT[ 615], INIT[2662], INIT[ 614], INIT[2661], INIT[ 613], INIT[2660], INIT[ 612], + INIT[2659], INIT[ 611], INIT[2658], INIT[ 610], INIT[2657], INIT[ 609], INIT[2656], INIT[ 608], + INIT[2655], INIT[ 607], INIT[2654], INIT[ 606], INIT[2653], INIT[ 605], INIT[2652], INIT[ 604], + INIT[2651], INIT[ 603], INIT[2650], INIT[ 602], INIT[2649], INIT[ 601], INIT[2648], INIT[ 600], + INIT[2647], INIT[ 599], INIT[2646], INIT[ 598], INIT[2645], INIT[ 597], INIT[2644], INIT[ 596], + INIT[2643], INIT[ 595], INIT[2642], INIT[ 594], INIT[2641], INIT[ 593], INIT[2640], INIT[ 592], + INIT[2639], INIT[ 591], INIT[2638], INIT[ 590], INIT[2637], INIT[ 589], INIT[2636], INIT[ 588], + INIT[2635], INIT[ 587], INIT[2634], INIT[ 586], INIT[2633], INIT[ 585], INIT[2632], INIT[ 584], + INIT[2631], INIT[ 583], INIT[2630], INIT[ 582], INIT[2629], INIT[ 581], INIT[2628], INIT[ 580], + INIT[2627], INIT[ 579], INIT[2626], INIT[ 578], INIT[2625], INIT[ 577], INIT[2624], INIT[ 576], + INIT[2623], INIT[ 575], INIT[2622], INIT[ 574], INIT[2621], INIT[ 573], INIT[2620], INIT[ 572], + INIT[2619], INIT[ 571], INIT[2618], INIT[ 570], INIT[2617], INIT[ 569], INIT[2616], INIT[ 568], + INIT[2615], INIT[ 567], INIT[2614], INIT[ 566], INIT[2613], INIT[ 565], INIT[2612], INIT[ 564], + INIT[2611], INIT[ 563], INIT[2610], INIT[ 562], INIT[2609], INIT[ 561], INIT[2608], INIT[ 560], + INIT[2607], INIT[ 559], INIT[2606], INIT[ 558], INIT[2605], INIT[ 557], INIT[2604], INIT[ 556], + INIT[2603], INIT[ 555], INIT[2602], INIT[ 554], INIT[2601], INIT[ 553], INIT[2600], INIT[ 552], + INIT[2599], INIT[ 551], INIT[2598], INIT[ 550], INIT[2597], INIT[ 549], INIT[2596], INIT[ 548], + INIT[2595], INIT[ 547], INIT[2594], INIT[ 546], INIT[2593], INIT[ 545], INIT[2592], INIT[ 544], + INIT[2591], INIT[ 543], INIT[2590], INIT[ 542], INIT[2589], INIT[ 541], INIT[2588], INIT[ 540], + INIT[2587], INIT[ 539], INIT[2586], INIT[ 538], INIT[2585], INIT[ 537], INIT[2584], INIT[ 536], + INIT[2583], INIT[ 535], INIT[2582], INIT[ 534], INIT[2581], INIT[ 533], INIT[2580], INIT[ 532], + INIT[2579], INIT[ 531], INIT[2578], INIT[ 530], INIT[2577], INIT[ 529], INIT[2576], INIT[ 528], + INIT[2575], INIT[ 527], INIT[2574], INIT[ 526], INIT[2573], INIT[ 525], INIT[2572], INIT[ 524], + INIT[2571], INIT[ 523], INIT[2570], INIT[ 522], INIT[2569], INIT[ 521], INIT[2568], INIT[ 520], + INIT[2567], INIT[ 519], INIT[2566], INIT[ 518], INIT[2565], INIT[ 517], INIT[2564], INIT[ 516], + INIT[2563], INIT[ 515], INIT[2562], INIT[ 514], INIT[2561], INIT[ 513], INIT[2560], INIT[ 512] +}; +localparam [255:0] INIT_5 = { + INIT[2815], INIT[ 767], INIT[2814], INIT[ 766], INIT[2813], INIT[ 765], INIT[2812], INIT[ 764], + INIT[2811], INIT[ 763], INIT[2810], INIT[ 762], INIT[2809], INIT[ 761], INIT[2808], INIT[ 760], + INIT[2807], INIT[ 759], INIT[2806], INIT[ 758], INIT[2805], INIT[ 757], INIT[2804], INIT[ 756], + INIT[2803], INIT[ 755], INIT[2802], INIT[ 754], INIT[2801], INIT[ 753], INIT[2800], INIT[ 752], + INIT[2799], INIT[ 751], INIT[2798], INIT[ 750], INIT[2797], INIT[ 749], INIT[2796], INIT[ 748], + INIT[2795], INIT[ 747], INIT[2794], INIT[ 746], INIT[2793], INIT[ 745], INIT[2792], INIT[ 744], + INIT[2791], INIT[ 743], INIT[2790], INIT[ 742], INIT[2789], INIT[ 741], INIT[2788], INIT[ 740], + INIT[2787], INIT[ 739], INIT[2786], INIT[ 738], INIT[2785], INIT[ 737], INIT[2784], INIT[ 736], + INIT[2783], INIT[ 735], INIT[2782], INIT[ 734], INIT[2781], INIT[ 733], INIT[2780], INIT[ 732], + INIT[2779], INIT[ 731], INIT[2778], INIT[ 730], INIT[2777], INIT[ 729], INIT[2776], INIT[ 728], + INIT[2775], INIT[ 727], INIT[2774], INIT[ 726], INIT[2773], INIT[ 725], INIT[2772], INIT[ 724], + INIT[2771], INIT[ 723], INIT[2770], INIT[ 722], INIT[2769], INIT[ 721], INIT[2768], INIT[ 720], + INIT[2767], INIT[ 719], INIT[2766], INIT[ 718], INIT[2765], INIT[ 717], INIT[2764], INIT[ 716], + INIT[2763], INIT[ 715], INIT[2762], INIT[ 714], INIT[2761], INIT[ 713], INIT[2760], INIT[ 712], + INIT[2759], INIT[ 711], INIT[2758], INIT[ 710], INIT[2757], INIT[ 709], INIT[2756], INIT[ 708], + INIT[2755], INIT[ 707], INIT[2754], INIT[ 706], INIT[2753], INIT[ 705], INIT[2752], INIT[ 704], + INIT[2751], INIT[ 703], INIT[2750], INIT[ 702], INIT[2749], INIT[ 701], INIT[2748], INIT[ 700], + INIT[2747], INIT[ 699], INIT[2746], INIT[ 698], INIT[2745], INIT[ 697], INIT[2744], INIT[ 696], + INIT[2743], INIT[ 695], INIT[2742], INIT[ 694], INIT[2741], INIT[ 693], INIT[2740], INIT[ 692], + INIT[2739], INIT[ 691], INIT[2738], INIT[ 690], INIT[2737], INIT[ 689], INIT[2736], INIT[ 688], + INIT[2735], INIT[ 687], INIT[2734], INIT[ 686], INIT[2733], INIT[ 685], INIT[2732], INIT[ 684], + INIT[2731], INIT[ 683], INIT[2730], INIT[ 682], INIT[2729], INIT[ 681], INIT[2728], INIT[ 680], + INIT[2727], INIT[ 679], INIT[2726], INIT[ 678], INIT[2725], INIT[ 677], INIT[2724], INIT[ 676], + INIT[2723], INIT[ 675], INIT[2722], INIT[ 674], INIT[2721], INIT[ 673], INIT[2720], INIT[ 672], + INIT[2719], INIT[ 671], INIT[2718], INIT[ 670], INIT[2717], INIT[ 669], INIT[2716], INIT[ 668], + INIT[2715], INIT[ 667], INIT[2714], INIT[ 666], INIT[2713], INIT[ 665], INIT[2712], INIT[ 664], + INIT[2711], INIT[ 663], INIT[2710], INIT[ 662], INIT[2709], INIT[ 661], INIT[2708], INIT[ 660], + INIT[2707], INIT[ 659], INIT[2706], INIT[ 658], INIT[2705], INIT[ 657], INIT[2704], INIT[ 656], + INIT[2703], INIT[ 655], INIT[2702], INIT[ 654], INIT[2701], INIT[ 653], INIT[2700], INIT[ 652], + INIT[2699], INIT[ 651], INIT[2698], INIT[ 650], INIT[2697], INIT[ 649], INIT[2696], INIT[ 648], + INIT[2695], INIT[ 647], INIT[2694], INIT[ 646], INIT[2693], INIT[ 645], INIT[2692], INIT[ 644], + INIT[2691], INIT[ 643], INIT[2690], INIT[ 642], INIT[2689], INIT[ 641], INIT[2688], INIT[ 640] +}; +localparam [255:0] INIT_6 = { + INIT[2943], INIT[ 895], INIT[2942], INIT[ 894], INIT[2941], INIT[ 893], INIT[2940], INIT[ 892], + INIT[2939], INIT[ 891], INIT[2938], INIT[ 890], INIT[2937], INIT[ 889], INIT[2936], INIT[ 888], + INIT[2935], INIT[ 887], INIT[2934], INIT[ 886], INIT[2933], INIT[ 885], INIT[2932], INIT[ 884], + INIT[2931], INIT[ 883], INIT[2930], INIT[ 882], INIT[2929], INIT[ 881], INIT[2928], INIT[ 880], + INIT[2927], INIT[ 879], INIT[2926], INIT[ 878], INIT[2925], INIT[ 877], INIT[2924], INIT[ 876], + INIT[2923], INIT[ 875], INIT[2922], INIT[ 874], INIT[2921], INIT[ 873], INIT[2920], INIT[ 872], + INIT[2919], INIT[ 871], INIT[2918], INIT[ 870], INIT[2917], INIT[ 869], INIT[2916], INIT[ 868], + INIT[2915], INIT[ 867], INIT[2914], INIT[ 866], INIT[2913], INIT[ 865], INIT[2912], INIT[ 864], + INIT[2911], INIT[ 863], INIT[2910], INIT[ 862], INIT[2909], INIT[ 861], INIT[2908], INIT[ 860], + INIT[2907], INIT[ 859], INIT[2906], INIT[ 858], INIT[2905], INIT[ 857], INIT[2904], INIT[ 856], + INIT[2903], INIT[ 855], INIT[2902], INIT[ 854], INIT[2901], INIT[ 853], INIT[2900], INIT[ 852], + INIT[2899], INIT[ 851], INIT[2898], INIT[ 850], INIT[2897], INIT[ 849], INIT[2896], INIT[ 848], + INIT[2895], INIT[ 847], INIT[2894], INIT[ 846], INIT[2893], INIT[ 845], INIT[2892], INIT[ 844], + INIT[2891], INIT[ 843], INIT[2890], INIT[ 842], INIT[2889], INIT[ 841], INIT[2888], INIT[ 840], + INIT[2887], INIT[ 839], INIT[2886], INIT[ 838], INIT[2885], INIT[ 837], INIT[2884], INIT[ 836], + INIT[2883], INIT[ 835], INIT[2882], INIT[ 834], INIT[2881], INIT[ 833], INIT[2880], INIT[ 832], + INIT[2879], INIT[ 831], INIT[2878], INIT[ 830], INIT[2877], INIT[ 829], INIT[2876], INIT[ 828], + INIT[2875], INIT[ 827], INIT[2874], INIT[ 826], INIT[2873], INIT[ 825], INIT[2872], INIT[ 824], + INIT[2871], INIT[ 823], INIT[2870], INIT[ 822], INIT[2869], INIT[ 821], INIT[2868], INIT[ 820], + INIT[2867], INIT[ 819], INIT[2866], INIT[ 818], INIT[2865], INIT[ 817], INIT[2864], INIT[ 816], + INIT[2863], INIT[ 815], INIT[2862], INIT[ 814], INIT[2861], INIT[ 813], INIT[2860], INIT[ 812], + INIT[2859], INIT[ 811], INIT[2858], INIT[ 810], INIT[2857], INIT[ 809], INIT[2856], INIT[ 808], + INIT[2855], INIT[ 807], INIT[2854], INIT[ 806], INIT[2853], INIT[ 805], INIT[2852], INIT[ 804], + INIT[2851], INIT[ 803], INIT[2850], INIT[ 802], INIT[2849], INIT[ 801], INIT[2848], INIT[ 800], + INIT[2847], INIT[ 799], INIT[2846], INIT[ 798], INIT[2845], INIT[ 797], INIT[2844], INIT[ 796], + INIT[2843], INIT[ 795], INIT[2842], INIT[ 794], INIT[2841], INIT[ 793], INIT[2840], INIT[ 792], + INIT[2839], INIT[ 791], INIT[2838], INIT[ 790], INIT[2837], INIT[ 789], INIT[2836], INIT[ 788], + INIT[2835], INIT[ 787], INIT[2834], INIT[ 786], INIT[2833], INIT[ 785], INIT[2832], INIT[ 784], + INIT[2831], INIT[ 783], INIT[2830], INIT[ 782], INIT[2829], INIT[ 781], INIT[2828], INIT[ 780], + INIT[2827], INIT[ 779], INIT[2826], INIT[ 778], INIT[2825], INIT[ 777], INIT[2824], INIT[ 776], + INIT[2823], INIT[ 775], INIT[2822], INIT[ 774], INIT[2821], INIT[ 773], INIT[2820], INIT[ 772], + INIT[2819], INIT[ 771], INIT[2818], INIT[ 770], INIT[2817], INIT[ 769], INIT[2816], INIT[ 768] +}; +localparam [255:0] INIT_7 = { + INIT[3071], INIT[1023], INIT[3070], INIT[1022], INIT[3069], INIT[1021], INIT[3068], INIT[1020], + INIT[3067], INIT[1019], INIT[3066], INIT[1018], INIT[3065], INIT[1017], INIT[3064], INIT[1016], + INIT[3063], INIT[1015], INIT[3062], INIT[1014], INIT[3061], INIT[1013], INIT[3060], INIT[1012], + INIT[3059], INIT[1011], INIT[3058], INIT[1010], INIT[3057], INIT[1009], INIT[3056], INIT[1008], + INIT[3055], INIT[1007], INIT[3054], INIT[1006], INIT[3053], INIT[1005], INIT[3052], INIT[1004], + INIT[3051], INIT[1003], INIT[3050], INIT[1002], INIT[3049], INIT[1001], INIT[3048], INIT[1000], + INIT[3047], INIT[ 999], INIT[3046], INIT[ 998], INIT[3045], INIT[ 997], INIT[3044], INIT[ 996], + INIT[3043], INIT[ 995], INIT[3042], INIT[ 994], INIT[3041], INIT[ 993], INIT[3040], INIT[ 992], + INIT[3039], INIT[ 991], INIT[3038], INIT[ 990], INIT[3037], INIT[ 989], INIT[3036], INIT[ 988], + INIT[3035], INIT[ 987], INIT[3034], INIT[ 986], INIT[3033], INIT[ 985], INIT[3032], INIT[ 984], + INIT[3031], INIT[ 983], INIT[3030], INIT[ 982], INIT[3029], INIT[ 981], INIT[3028], INIT[ 980], + INIT[3027], INIT[ 979], INIT[3026], INIT[ 978], INIT[3025], INIT[ 977], INIT[3024], INIT[ 976], + INIT[3023], INIT[ 975], INIT[3022], INIT[ 974], INIT[3021], INIT[ 973], INIT[3020], INIT[ 972], + INIT[3019], INIT[ 971], INIT[3018], INIT[ 970], INIT[3017], INIT[ 969], INIT[3016], INIT[ 968], + INIT[3015], INIT[ 967], INIT[3014], INIT[ 966], INIT[3013], INIT[ 965], INIT[3012], INIT[ 964], + INIT[3011], INIT[ 963], INIT[3010], INIT[ 962], INIT[3009], INIT[ 961], INIT[3008], INIT[ 960], + INIT[3007], INIT[ 959], INIT[3006], INIT[ 958], INIT[3005], INIT[ 957], INIT[3004], INIT[ 956], + INIT[3003], INIT[ 955], INIT[3002], INIT[ 954], INIT[3001], INIT[ 953], INIT[3000], INIT[ 952], + INIT[2999], INIT[ 951], INIT[2998], INIT[ 950], INIT[2997], INIT[ 949], INIT[2996], INIT[ 948], + INIT[2995], INIT[ 947], INIT[2994], INIT[ 946], INIT[2993], INIT[ 945], INIT[2992], INIT[ 944], + INIT[2991], INIT[ 943], INIT[2990], INIT[ 942], INIT[2989], INIT[ 941], INIT[2988], INIT[ 940], + INIT[2987], INIT[ 939], INIT[2986], INIT[ 938], INIT[2985], INIT[ 937], INIT[2984], INIT[ 936], + INIT[2983], INIT[ 935], INIT[2982], INIT[ 934], INIT[2981], INIT[ 933], INIT[2980], INIT[ 932], + INIT[2979], INIT[ 931], INIT[2978], INIT[ 930], INIT[2977], INIT[ 929], INIT[2976], INIT[ 928], + INIT[2975], INIT[ 927], INIT[2974], INIT[ 926], INIT[2973], INIT[ 925], INIT[2972], INIT[ 924], + INIT[2971], INIT[ 923], INIT[2970], INIT[ 922], INIT[2969], INIT[ 921], INIT[2968], INIT[ 920], + INIT[2967], INIT[ 919], INIT[2966], INIT[ 918], INIT[2965], INIT[ 917], INIT[2964], INIT[ 916], + INIT[2963], INIT[ 915], INIT[2962], INIT[ 914], INIT[2961], INIT[ 913], INIT[2960], INIT[ 912], + INIT[2959], INIT[ 911], INIT[2958], INIT[ 910], INIT[2957], INIT[ 909], INIT[2956], INIT[ 908], + INIT[2955], INIT[ 907], INIT[2954], INIT[ 906], INIT[2953], INIT[ 905], INIT[2952], INIT[ 904], + INIT[2951], INIT[ 903], INIT[2950], INIT[ 902], INIT[2949], INIT[ 901], INIT[2948], INIT[ 900], + INIT[2947], INIT[ 899], INIT[2946], INIT[ 898], INIT[2945], INIT[ 897], INIT[2944], INIT[ 896] +}; +localparam [255:0] INIT_8 = { + INIT[3199], INIT[1151], INIT[3198], INIT[1150], INIT[3197], INIT[1149], INIT[3196], INIT[1148], + INIT[3195], INIT[1147], INIT[3194], INIT[1146], INIT[3193], INIT[1145], INIT[3192], INIT[1144], + INIT[3191], INIT[1143], INIT[3190], INIT[1142], INIT[3189], INIT[1141], INIT[3188], INIT[1140], + INIT[3187], INIT[1139], INIT[3186], INIT[1138], INIT[3185], INIT[1137], INIT[3184], INIT[1136], + INIT[3183], INIT[1135], INIT[3182], INIT[1134], INIT[3181], INIT[1133], INIT[3180], INIT[1132], + INIT[3179], INIT[1131], INIT[3178], INIT[1130], INIT[3177], INIT[1129], INIT[3176], INIT[1128], + INIT[3175], INIT[1127], INIT[3174], INIT[1126], INIT[3173], INIT[1125], INIT[3172], INIT[1124], + INIT[3171], INIT[1123], INIT[3170], INIT[1122], INIT[3169], INIT[1121], INIT[3168], INIT[1120], + INIT[3167], INIT[1119], INIT[3166], INIT[1118], INIT[3165], INIT[1117], INIT[3164], INIT[1116], + INIT[3163], INIT[1115], INIT[3162], INIT[1114], INIT[3161], INIT[1113], INIT[3160], INIT[1112], + INIT[3159], INIT[1111], INIT[3158], INIT[1110], INIT[3157], INIT[1109], INIT[3156], INIT[1108], + INIT[3155], INIT[1107], INIT[3154], INIT[1106], INIT[3153], INIT[1105], INIT[3152], INIT[1104], + INIT[3151], INIT[1103], INIT[3150], INIT[1102], INIT[3149], INIT[1101], INIT[3148], INIT[1100], + INIT[3147], INIT[1099], INIT[3146], INIT[1098], INIT[3145], INIT[1097], INIT[3144], INIT[1096], + INIT[3143], INIT[1095], INIT[3142], INIT[1094], INIT[3141], INIT[1093], INIT[3140], INIT[1092], + INIT[3139], INIT[1091], INIT[3138], INIT[1090], INIT[3137], INIT[1089], INIT[3136], INIT[1088], + INIT[3135], INIT[1087], INIT[3134], INIT[1086], INIT[3133], INIT[1085], INIT[3132], INIT[1084], + INIT[3131], INIT[1083], INIT[3130], INIT[1082], INIT[3129], INIT[1081], INIT[3128], INIT[1080], + INIT[3127], INIT[1079], INIT[3126], INIT[1078], INIT[3125], INIT[1077], INIT[3124], INIT[1076], + INIT[3123], INIT[1075], INIT[3122], INIT[1074], INIT[3121], INIT[1073], INIT[3120], INIT[1072], + INIT[3119], INIT[1071], INIT[3118], INIT[1070], INIT[3117], INIT[1069], INIT[3116], INIT[1068], + INIT[3115], INIT[1067], INIT[3114], INIT[1066], INIT[3113], INIT[1065], INIT[3112], INIT[1064], + INIT[3111], INIT[1063], INIT[3110], INIT[1062], INIT[3109], INIT[1061], INIT[3108], INIT[1060], + INIT[3107], INIT[1059], INIT[3106], INIT[1058], INIT[3105], INIT[1057], INIT[3104], INIT[1056], + INIT[3103], INIT[1055], INIT[3102], INIT[1054], INIT[3101], INIT[1053], INIT[3100], INIT[1052], + INIT[3099], INIT[1051], INIT[3098], INIT[1050], INIT[3097], INIT[1049], INIT[3096], INIT[1048], + INIT[3095], INIT[1047], INIT[3094], INIT[1046], INIT[3093], INIT[1045], INIT[3092], INIT[1044], + INIT[3091], INIT[1043], INIT[3090], INIT[1042], INIT[3089], INIT[1041], INIT[3088], INIT[1040], + INIT[3087], INIT[1039], INIT[3086], INIT[1038], INIT[3085], INIT[1037], INIT[3084], INIT[1036], + INIT[3083], INIT[1035], INIT[3082], INIT[1034], INIT[3081], INIT[1033], INIT[3080], INIT[1032], + INIT[3079], INIT[1031], INIT[3078], INIT[1030], INIT[3077], INIT[1029], INIT[3076], INIT[1028], + INIT[3075], INIT[1027], INIT[3074], INIT[1026], INIT[3073], INIT[1025], INIT[3072], INIT[1024] +}; +localparam [255:0] INIT_9 = { + INIT[3327], INIT[1279], INIT[3326], INIT[1278], INIT[3325], INIT[1277], INIT[3324], INIT[1276], + INIT[3323], INIT[1275], INIT[3322], INIT[1274], INIT[3321], INIT[1273], INIT[3320], INIT[1272], + INIT[3319], INIT[1271], INIT[3318], INIT[1270], INIT[3317], INIT[1269], INIT[3316], INIT[1268], + INIT[3315], INIT[1267], INIT[3314], INIT[1266], INIT[3313], INIT[1265], INIT[3312], INIT[1264], + INIT[3311], INIT[1263], INIT[3310], INIT[1262], INIT[3309], INIT[1261], INIT[3308], INIT[1260], + INIT[3307], INIT[1259], INIT[3306], INIT[1258], INIT[3305], INIT[1257], INIT[3304], INIT[1256], + INIT[3303], INIT[1255], INIT[3302], INIT[1254], INIT[3301], INIT[1253], INIT[3300], INIT[1252], + INIT[3299], INIT[1251], INIT[3298], INIT[1250], INIT[3297], INIT[1249], INIT[3296], INIT[1248], + INIT[3295], INIT[1247], INIT[3294], INIT[1246], INIT[3293], INIT[1245], INIT[3292], INIT[1244], + INIT[3291], INIT[1243], INIT[3290], INIT[1242], INIT[3289], INIT[1241], INIT[3288], INIT[1240], + INIT[3287], INIT[1239], INIT[3286], INIT[1238], INIT[3285], INIT[1237], INIT[3284], INIT[1236], + INIT[3283], INIT[1235], INIT[3282], INIT[1234], INIT[3281], INIT[1233], INIT[3280], INIT[1232], + INIT[3279], INIT[1231], INIT[3278], INIT[1230], INIT[3277], INIT[1229], INIT[3276], INIT[1228], + INIT[3275], INIT[1227], INIT[3274], INIT[1226], INIT[3273], INIT[1225], INIT[3272], INIT[1224], + INIT[3271], INIT[1223], INIT[3270], INIT[1222], INIT[3269], INIT[1221], INIT[3268], INIT[1220], + INIT[3267], INIT[1219], INIT[3266], INIT[1218], INIT[3265], INIT[1217], INIT[3264], INIT[1216], + INIT[3263], INIT[1215], INIT[3262], INIT[1214], INIT[3261], INIT[1213], INIT[3260], INIT[1212], + INIT[3259], INIT[1211], INIT[3258], INIT[1210], INIT[3257], INIT[1209], INIT[3256], INIT[1208], + INIT[3255], INIT[1207], INIT[3254], INIT[1206], INIT[3253], INIT[1205], INIT[3252], INIT[1204], + INIT[3251], INIT[1203], INIT[3250], INIT[1202], INIT[3249], INIT[1201], INIT[3248], INIT[1200], + INIT[3247], INIT[1199], INIT[3246], INIT[1198], INIT[3245], INIT[1197], INIT[3244], INIT[1196], + INIT[3243], INIT[1195], INIT[3242], INIT[1194], INIT[3241], INIT[1193], INIT[3240], INIT[1192], + INIT[3239], INIT[1191], INIT[3238], INIT[1190], INIT[3237], INIT[1189], INIT[3236], INIT[1188], + INIT[3235], INIT[1187], INIT[3234], INIT[1186], INIT[3233], INIT[1185], INIT[3232], INIT[1184], + INIT[3231], INIT[1183], INIT[3230], INIT[1182], INIT[3229], INIT[1181], INIT[3228], INIT[1180], + INIT[3227], INIT[1179], INIT[3226], INIT[1178], INIT[3225], INIT[1177], INIT[3224], INIT[1176], + INIT[3223], INIT[1175], INIT[3222], INIT[1174], INIT[3221], INIT[1173], INIT[3220], INIT[1172], + INIT[3219], INIT[1171], INIT[3218], INIT[1170], INIT[3217], INIT[1169], INIT[3216], INIT[1168], + INIT[3215], INIT[1167], INIT[3214], INIT[1166], INIT[3213], INIT[1165], INIT[3212], INIT[1164], + INIT[3211], INIT[1163], INIT[3210], INIT[1162], INIT[3209], INIT[1161], INIT[3208], INIT[1160], + INIT[3207], INIT[1159], INIT[3206], INIT[1158], INIT[3205], INIT[1157], INIT[3204], INIT[1156], + INIT[3203], INIT[1155], INIT[3202], INIT[1154], INIT[3201], INIT[1153], INIT[3200], INIT[1152] +}; +localparam [255:0] INIT_A = { + INIT[3455], INIT[1407], INIT[3454], INIT[1406], INIT[3453], INIT[1405], INIT[3452], INIT[1404], + INIT[3451], INIT[1403], INIT[3450], INIT[1402], INIT[3449], INIT[1401], INIT[3448], INIT[1400], + INIT[3447], INIT[1399], INIT[3446], INIT[1398], INIT[3445], INIT[1397], INIT[3444], INIT[1396], + INIT[3443], INIT[1395], INIT[3442], INIT[1394], INIT[3441], INIT[1393], INIT[3440], INIT[1392], + INIT[3439], INIT[1391], INIT[3438], INIT[1390], INIT[3437], INIT[1389], INIT[3436], INIT[1388], + INIT[3435], INIT[1387], INIT[3434], INIT[1386], INIT[3433], INIT[1385], INIT[3432], INIT[1384], + INIT[3431], INIT[1383], INIT[3430], INIT[1382], INIT[3429], INIT[1381], INIT[3428], INIT[1380], + INIT[3427], INIT[1379], INIT[3426], INIT[1378], INIT[3425], INIT[1377], INIT[3424], INIT[1376], + INIT[3423], INIT[1375], INIT[3422], INIT[1374], INIT[3421], INIT[1373], INIT[3420], INIT[1372], + INIT[3419], INIT[1371], INIT[3418], INIT[1370], INIT[3417], INIT[1369], INIT[3416], INIT[1368], + INIT[3415], INIT[1367], INIT[3414], INIT[1366], INIT[3413], INIT[1365], INIT[3412], INIT[1364], + INIT[3411], INIT[1363], INIT[3410], INIT[1362], INIT[3409], INIT[1361], INIT[3408], INIT[1360], + INIT[3407], INIT[1359], INIT[3406], INIT[1358], INIT[3405], INIT[1357], INIT[3404], INIT[1356], + INIT[3403], INIT[1355], INIT[3402], INIT[1354], INIT[3401], INIT[1353], INIT[3400], INIT[1352], + INIT[3399], INIT[1351], INIT[3398], INIT[1350], INIT[3397], INIT[1349], INIT[3396], INIT[1348], + INIT[3395], INIT[1347], INIT[3394], INIT[1346], INIT[3393], INIT[1345], INIT[3392], INIT[1344], + INIT[3391], INIT[1343], INIT[3390], INIT[1342], INIT[3389], INIT[1341], INIT[3388], INIT[1340], + INIT[3387], INIT[1339], INIT[3386], INIT[1338], INIT[3385], INIT[1337], INIT[3384], INIT[1336], + INIT[3383], INIT[1335], INIT[3382], INIT[1334], INIT[3381], INIT[1333], INIT[3380], INIT[1332], + INIT[3379], INIT[1331], INIT[3378], INIT[1330], INIT[3377], INIT[1329], INIT[3376], INIT[1328], + INIT[3375], INIT[1327], INIT[3374], INIT[1326], INIT[3373], INIT[1325], INIT[3372], INIT[1324], + INIT[3371], INIT[1323], INIT[3370], INIT[1322], INIT[3369], INIT[1321], INIT[3368], INIT[1320], + INIT[3367], INIT[1319], INIT[3366], INIT[1318], INIT[3365], INIT[1317], INIT[3364], INIT[1316], + INIT[3363], INIT[1315], INIT[3362], INIT[1314], INIT[3361], INIT[1313], INIT[3360], INIT[1312], + INIT[3359], INIT[1311], INIT[3358], INIT[1310], INIT[3357], INIT[1309], INIT[3356], INIT[1308], + INIT[3355], INIT[1307], INIT[3354], INIT[1306], INIT[3353], INIT[1305], INIT[3352], INIT[1304], + INIT[3351], INIT[1303], INIT[3350], INIT[1302], INIT[3349], INIT[1301], INIT[3348], INIT[1300], + INIT[3347], INIT[1299], INIT[3346], INIT[1298], INIT[3345], INIT[1297], INIT[3344], INIT[1296], + INIT[3343], INIT[1295], INIT[3342], INIT[1294], INIT[3341], INIT[1293], INIT[3340], INIT[1292], + INIT[3339], INIT[1291], INIT[3338], INIT[1290], INIT[3337], INIT[1289], INIT[3336], INIT[1288], + INIT[3335], INIT[1287], INIT[3334], INIT[1286], INIT[3333], INIT[1285], INIT[3332], INIT[1284], + INIT[3331], INIT[1283], INIT[3330], INIT[1282], INIT[3329], INIT[1281], INIT[3328], INIT[1280] +}; +localparam [255:0] INIT_B = { + INIT[3583], INIT[1535], INIT[3582], INIT[1534], INIT[3581], INIT[1533], INIT[3580], INIT[1532], + INIT[3579], INIT[1531], INIT[3578], INIT[1530], INIT[3577], INIT[1529], INIT[3576], INIT[1528], + INIT[3575], INIT[1527], INIT[3574], INIT[1526], INIT[3573], INIT[1525], INIT[3572], INIT[1524], + INIT[3571], INIT[1523], INIT[3570], INIT[1522], INIT[3569], INIT[1521], INIT[3568], INIT[1520], + INIT[3567], INIT[1519], INIT[3566], INIT[1518], INIT[3565], INIT[1517], INIT[3564], INIT[1516], + INIT[3563], INIT[1515], INIT[3562], INIT[1514], INIT[3561], INIT[1513], INIT[3560], INIT[1512], + INIT[3559], INIT[1511], INIT[3558], INIT[1510], INIT[3557], INIT[1509], INIT[3556], INIT[1508], + INIT[3555], INIT[1507], INIT[3554], INIT[1506], INIT[3553], INIT[1505], INIT[3552], INIT[1504], + INIT[3551], INIT[1503], INIT[3550], INIT[1502], INIT[3549], INIT[1501], INIT[3548], INIT[1500], + INIT[3547], INIT[1499], INIT[3546], INIT[1498], INIT[3545], INIT[1497], INIT[3544], INIT[1496], + INIT[3543], INIT[1495], INIT[3542], INIT[1494], INIT[3541], INIT[1493], INIT[3540], INIT[1492], + INIT[3539], INIT[1491], INIT[3538], INIT[1490], INIT[3537], INIT[1489], INIT[3536], INIT[1488], + INIT[3535], INIT[1487], INIT[3534], INIT[1486], INIT[3533], INIT[1485], INIT[3532], INIT[1484], + INIT[3531], INIT[1483], INIT[3530], INIT[1482], INIT[3529], INIT[1481], INIT[3528], INIT[1480], + INIT[3527], INIT[1479], INIT[3526], INIT[1478], INIT[3525], INIT[1477], INIT[3524], INIT[1476], + INIT[3523], INIT[1475], INIT[3522], INIT[1474], INIT[3521], INIT[1473], INIT[3520], INIT[1472], + INIT[3519], INIT[1471], INIT[3518], INIT[1470], INIT[3517], INIT[1469], INIT[3516], INIT[1468], + INIT[3515], INIT[1467], INIT[3514], INIT[1466], INIT[3513], INIT[1465], INIT[3512], INIT[1464], + INIT[3511], INIT[1463], INIT[3510], INIT[1462], INIT[3509], INIT[1461], INIT[3508], INIT[1460], + INIT[3507], INIT[1459], INIT[3506], INIT[1458], INIT[3505], INIT[1457], INIT[3504], INIT[1456], + INIT[3503], INIT[1455], INIT[3502], INIT[1454], INIT[3501], INIT[1453], INIT[3500], INIT[1452], + INIT[3499], INIT[1451], INIT[3498], INIT[1450], INIT[3497], INIT[1449], INIT[3496], INIT[1448], + INIT[3495], INIT[1447], INIT[3494], INIT[1446], INIT[3493], INIT[1445], INIT[3492], INIT[1444], + INIT[3491], INIT[1443], INIT[3490], INIT[1442], INIT[3489], INIT[1441], INIT[3488], INIT[1440], + INIT[3487], INIT[1439], INIT[3486], INIT[1438], INIT[3485], INIT[1437], INIT[3484], INIT[1436], + INIT[3483], INIT[1435], INIT[3482], INIT[1434], INIT[3481], INIT[1433], INIT[3480], INIT[1432], + INIT[3479], INIT[1431], INIT[3478], INIT[1430], INIT[3477], INIT[1429], INIT[3476], INIT[1428], + INIT[3475], INIT[1427], INIT[3474], INIT[1426], INIT[3473], INIT[1425], INIT[3472], INIT[1424], + INIT[3471], INIT[1423], INIT[3470], INIT[1422], INIT[3469], INIT[1421], INIT[3468], INIT[1420], + INIT[3467], INIT[1419], INIT[3466], INIT[1418], INIT[3465], INIT[1417], INIT[3464], INIT[1416], + INIT[3463], INIT[1415], INIT[3462], INIT[1414], INIT[3461], INIT[1413], INIT[3460], INIT[1412], + INIT[3459], INIT[1411], INIT[3458], INIT[1410], INIT[3457], INIT[1409], INIT[3456], INIT[1408] +}; +localparam [255:0] INIT_C = { + INIT[3711], INIT[1663], INIT[3710], INIT[1662], INIT[3709], INIT[1661], INIT[3708], INIT[1660], + INIT[3707], INIT[1659], INIT[3706], INIT[1658], INIT[3705], INIT[1657], INIT[3704], INIT[1656], + INIT[3703], INIT[1655], INIT[3702], INIT[1654], INIT[3701], INIT[1653], INIT[3700], INIT[1652], + INIT[3699], INIT[1651], INIT[3698], INIT[1650], INIT[3697], INIT[1649], INIT[3696], INIT[1648], + INIT[3695], INIT[1647], INIT[3694], INIT[1646], INIT[3693], INIT[1645], INIT[3692], INIT[1644], + INIT[3691], INIT[1643], INIT[3690], INIT[1642], INIT[3689], INIT[1641], INIT[3688], INIT[1640], + INIT[3687], INIT[1639], INIT[3686], INIT[1638], INIT[3685], INIT[1637], INIT[3684], INIT[1636], + INIT[3683], INIT[1635], INIT[3682], INIT[1634], INIT[3681], INIT[1633], INIT[3680], INIT[1632], + INIT[3679], INIT[1631], INIT[3678], INIT[1630], INIT[3677], INIT[1629], INIT[3676], INIT[1628], + INIT[3675], INIT[1627], INIT[3674], INIT[1626], INIT[3673], INIT[1625], INIT[3672], INIT[1624], + INIT[3671], INIT[1623], INIT[3670], INIT[1622], INIT[3669], INIT[1621], INIT[3668], INIT[1620], + INIT[3667], INIT[1619], INIT[3666], INIT[1618], INIT[3665], INIT[1617], INIT[3664], INIT[1616], + INIT[3663], INIT[1615], INIT[3662], INIT[1614], INIT[3661], INIT[1613], INIT[3660], INIT[1612], + INIT[3659], INIT[1611], INIT[3658], INIT[1610], INIT[3657], INIT[1609], INIT[3656], INIT[1608], + INIT[3655], INIT[1607], INIT[3654], INIT[1606], INIT[3653], INIT[1605], INIT[3652], INIT[1604], + INIT[3651], INIT[1603], INIT[3650], INIT[1602], INIT[3649], INIT[1601], INIT[3648], INIT[1600], + INIT[3647], INIT[1599], INIT[3646], INIT[1598], INIT[3645], INIT[1597], INIT[3644], INIT[1596], + INIT[3643], INIT[1595], INIT[3642], INIT[1594], INIT[3641], INIT[1593], INIT[3640], INIT[1592], + INIT[3639], INIT[1591], INIT[3638], INIT[1590], INIT[3637], INIT[1589], INIT[3636], INIT[1588], + INIT[3635], INIT[1587], INIT[3634], INIT[1586], INIT[3633], INIT[1585], INIT[3632], INIT[1584], + INIT[3631], INIT[1583], INIT[3630], INIT[1582], INIT[3629], INIT[1581], INIT[3628], INIT[1580], + INIT[3627], INIT[1579], INIT[3626], INIT[1578], INIT[3625], INIT[1577], INIT[3624], INIT[1576], + INIT[3623], INIT[1575], INIT[3622], INIT[1574], INIT[3621], INIT[1573], INIT[3620], INIT[1572], + INIT[3619], INIT[1571], INIT[3618], INIT[1570], INIT[3617], INIT[1569], INIT[3616], INIT[1568], + INIT[3615], INIT[1567], INIT[3614], INIT[1566], INIT[3613], INIT[1565], INIT[3612], INIT[1564], + INIT[3611], INIT[1563], INIT[3610], INIT[1562], INIT[3609], INIT[1561], INIT[3608], INIT[1560], + INIT[3607], INIT[1559], INIT[3606], INIT[1558], INIT[3605], INIT[1557], INIT[3604], INIT[1556], + INIT[3603], INIT[1555], INIT[3602], INIT[1554], INIT[3601], INIT[1553], INIT[3600], INIT[1552], + INIT[3599], INIT[1551], INIT[3598], INIT[1550], INIT[3597], INIT[1549], INIT[3596], INIT[1548], + INIT[3595], INIT[1547], INIT[3594], INIT[1546], INIT[3593], INIT[1545], INIT[3592], INIT[1544], + INIT[3591], INIT[1543], INIT[3590], INIT[1542], INIT[3589], INIT[1541], INIT[3588], INIT[1540], + INIT[3587], INIT[1539], INIT[3586], INIT[1538], INIT[3585], INIT[1537], INIT[3584], INIT[1536] +}; +localparam [255:0] INIT_D = { + INIT[3839], INIT[1791], INIT[3838], INIT[1790], INIT[3837], INIT[1789], INIT[3836], INIT[1788], + INIT[3835], INIT[1787], INIT[3834], INIT[1786], INIT[3833], INIT[1785], INIT[3832], INIT[1784], + INIT[3831], INIT[1783], INIT[3830], INIT[1782], INIT[3829], INIT[1781], INIT[3828], INIT[1780], + INIT[3827], INIT[1779], INIT[3826], INIT[1778], INIT[3825], INIT[1777], INIT[3824], INIT[1776], + INIT[3823], INIT[1775], INIT[3822], INIT[1774], INIT[3821], INIT[1773], INIT[3820], INIT[1772], + INIT[3819], INIT[1771], INIT[3818], INIT[1770], INIT[3817], INIT[1769], INIT[3816], INIT[1768], + INIT[3815], INIT[1767], INIT[3814], INIT[1766], INIT[3813], INIT[1765], INIT[3812], INIT[1764], + INIT[3811], INIT[1763], INIT[3810], INIT[1762], INIT[3809], INIT[1761], INIT[3808], INIT[1760], + INIT[3807], INIT[1759], INIT[3806], INIT[1758], INIT[3805], INIT[1757], INIT[3804], INIT[1756], + INIT[3803], INIT[1755], INIT[3802], INIT[1754], INIT[3801], INIT[1753], INIT[3800], INIT[1752], + INIT[3799], INIT[1751], INIT[3798], INIT[1750], INIT[3797], INIT[1749], INIT[3796], INIT[1748], + INIT[3795], INIT[1747], INIT[3794], INIT[1746], INIT[3793], INIT[1745], INIT[3792], INIT[1744], + INIT[3791], INIT[1743], INIT[3790], INIT[1742], INIT[3789], INIT[1741], INIT[3788], INIT[1740], + INIT[3787], INIT[1739], INIT[3786], INIT[1738], INIT[3785], INIT[1737], INIT[3784], INIT[1736], + INIT[3783], INIT[1735], INIT[3782], INIT[1734], INIT[3781], INIT[1733], INIT[3780], INIT[1732], + INIT[3779], INIT[1731], INIT[3778], INIT[1730], INIT[3777], INIT[1729], INIT[3776], INIT[1728], + INIT[3775], INIT[1727], INIT[3774], INIT[1726], INIT[3773], INIT[1725], INIT[3772], INIT[1724], + INIT[3771], INIT[1723], INIT[3770], INIT[1722], INIT[3769], INIT[1721], INIT[3768], INIT[1720], + INIT[3767], INIT[1719], INIT[3766], INIT[1718], INIT[3765], INIT[1717], INIT[3764], INIT[1716], + INIT[3763], INIT[1715], INIT[3762], INIT[1714], INIT[3761], INIT[1713], INIT[3760], INIT[1712], + INIT[3759], INIT[1711], INIT[3758], INIT[1710], INIT[3757], INIT[1709], INIT[3756], INIT[1708], + INIT[3755], INIT[1707], INIT[3754], INIT[1706], INIT[3753], INIT[1705], INIT[3752], INIT[1704], + INIT[3751], INIT[1703], INIT[3750], INIT[1702], INIT[3749], INIT[1701], INIT[3748], INIT[1700], + INIT[3747], INIT[1699], INIT[3746], INIT[1698], INIT[3745], INIT[1697], INIT[3744], INIT[1696], + INIT[3743], INIT[1695], INIT[3742], INIT[1694], INIT[3741], INIT[1693], INIT[3740], INIT[1692], + INIT[3739], INIT[1691], INIT[3738], INIT[1690], INIT[3737], INIT[1689], INIT[3736], INIT[1688], + INIT[3735], INIT[1687], INIT[3734], INIT[1686], INIT[3733], INIT[1685], INIT[3732], INIT[1684], + INIT[3731], INIT[1683], INIT[3730], INIT[1682], INIT[3729], INIT[1681], INIT[3728], INIT[1680], + INIT[3727], INIT[1679], INIT[3726], INIT[1678], INIT[3725], INIT[1677], INIT[3724], INIT[1676], + INIT[3723], INIT[1675], INIT[3722], INIT[1674], INIT[3721], INIT[1673], INIT[3720], INIT[1672], + INIT[3719], INIT[1671], INIT[3718], INIT[1670], INIT[3717], INIT[1669], INIT[3716], INIT[1668], + INIT[3715], INIT[1667], INIT[3714], INIT[1666], INIT[3713], INIT[1665], INIT[3712], INIT[1664] +}; +localparam [255:0] INIT_E = { + INIT[3967], INIT[1919], INIT[3966], INIT[1918], INIT[3965], INIT[1917], INIT[3964], INIT[1916], + INIT[3963], INIT[1915], INIT[3962], INIT[1914], INIT[3961], INIT[1913], INIT[3960], INIT[1912], + INIT[3959], INIT[1911], INIT[3958], INIT[1910], INIT[3957], INIT[1909], INIT[3956], INIT[1908], + INIT[3955], INIT[1907], INIT[3954], INIT[1906], INIT[3953], INIT[1905], INIT[3952], INIT[1904], + INIT[3951], INIT[1903], INIT[3950], INIT[1902], INIT[3949], INIT[1901], INIT[3948], INIT[1900], + INIT[3947], INIT[1899], INIT[3946], INIT[1898], INIT[3945], INIT[1897], INIT[3944], INIT[1896], + INIT[3943], INIT[1895], INIT[3942], INIT[1894], INIT[3941], INIT[1893], INIT[3940], INIT[1892], + INIT[3939], INIT[1891], INIT[3938], INIT[1890], INIT[3937], INIT[1889], INIT[3936], INIT[1888], + INIT[3935], INIT[1887], INIT[3934], INIT[1886], INIT[3933], INIT[1885], INIT[3932], INIT[1884], + INIT[3931], INIT[1883], INIT[3930], INIT[1882], INIT[3929], INIT[1881], INIT[3928], INIT[1880], + INIT[3927], INIT[1879], INIT[3926], INIT[1878], INIT[3925], INIT[1877], INIT[3924], INIT[1876], + INIT[3923], INIT[1875], INIT[3922], INIT[1874], INIT[3921], INIT[1873], INIT[3920], INIT[1872], + INIT[3919], INIT[1871], INIT[3918], INIT[1870], INIT[3917], INIT[1869], INIT[3916], INIT[1868], + INIT[3915], INIT[1867], INIT[3914], INIT[1866], INIT[3913], INIT[1865], INIT[3912], INIT[1864], + INIT[3911], INIT[1863], INIT[3910], INIT[1862], INIT[3909], INIT[1861], INIT[3908], INIT[1860], + INIT[3907], INIT[1859], INIT[3906], INIT[1858], INIT[3905], INIT[1857], INIT[3904], INIT[1856], + INIT[3903], INIT[1855], INIT[3902], INIT[1854], INIT[3901], INIT[1853], INIT[3900], INIT[1852], + INIT[3899], INIT[1851], INIT[3898], INIT[1850], INIT[3897], INIT[1849], INIT[3896], INIT[1848], + INIT[3895], INIT[1847], INIT[3894], INIT[1846], INIT[3893], INIT[1845], INIT[3892], INIT[1844], + INIT[3891], INIT[1843], INIT[3890], INIT[1842], INIT[3889], INIT[1841], INIT[3888], INIT[1840], + INIT[3887], INIT[1839], INIT[3886], INIT[1838], INIT[3885], INIT[1837], INIT[3884], INIT[1836], + INIT[3883], INIT[1835], INIT[3882], INIT[1834], INIT[3881], INIT[1833], INIT[3880], INIT[1832], + INIT[3879], INIT[1831], INIT[3878], INIT[1830], INIT[3877], INIT[1829], INIT[3876], INIT[1828], + INIT[3875], INIT[1827], INIT[3874], INIT[1826], INIT[3873], INIT[1825], INIT[3872], INIT[1824], + INIT[3871], INIT[1823], INIT[3870], INIT[1822], INIT[3869], INIT[1821], INIT[3868], INIT[1820], + INIT[3867], INIT[1819], INIT[3866], INIT[1818], INIT[3865], INIT[1817], INIT[3864], INIT[1816], + INIT[3863], INIT[1815], INIT[3862], INIT[1814], INIT[3861], INIT[1813], INIT[3860], INIT[1812], + INIT[3859], INIT[1811], INIT[3858], INIT[1810], INIT[3857], INIT[1809], INIT[3856], INIT[1808], + INIT[3855], INIT[1807], INIT[3854], INIT[1806], INIT[3853], INIT[1805], INIT[3852], INIT[1804], + INIT[3851], INIT[1803], INIT[3850], INIT[1802], INIT[3849], INIT[1801], INIT[3848], INIT[1800], + INIT[3847], INIT[1799], INIT[3846], INIT[1798], INIT[3845], INIT[1797], INIT[3844], INIT[1796], + INIT[3843], INIT[1795], INIT[3842], INIT[1794], INIT[3841], INIT[1793], INIT[3840], INIT[1792] +}; +localparam [255:0] INIT_F = { + INIT[4095], INIT[2047], INIT[4094], INIT[2046], INIT[4093], INIT[2045], INIT[4092], INIT[2044], + INIT[4091], INIT[2043], INIT[4090], INIT[2042], INIT[4089], INIT[2041], INIT[4088], INIT[2040], + INIT[4087], INIT[2039], INIT[4086], INIT[2038], INIT[4085], INIT[2037], INIT[4084], INIT[2036], + INIT[4083], INIT[2035], INIT[4082], INIT[2034], INIT[4081], INIT[2033], INIT[4080], INIT[2032], + INIT[4079], INIT[2031], INIT[4078], INIT[2030], INIT[4077], INIT[2029], INIT[4076], INIT[2028], + INIT[4075], INIT[2027], INIT[4074], INIT[2026], INIT[4073], INIT[2025], INIT[4072], INIT[2024], + INIT[4071], INIT[2023], INIT[4070], INIT[2022], INIT[4069], INIT[2021], INIT[4068], INIT[2020], + INIT[4067], INIT[2019], INIT[4066], INIT[2018], INIT[4065], INIT[2017], INIT[4064], INIT[2016], + INIT[4063], INIT[2015], INIT[4062], INIT[2014], INIT[4061], INIT[2013], INIT[4060], INIT[2012], + INIT[4059], INIT[2011], INIT[4058], INIT[2010], INIT[4057], INIT[2009], INIT[4056], INIT[2008], + INIT[4055], INIT[2007], INIT[4054], INIT[2006], INIT[4053], INIT[2005], INIT[4052], INIT[2004], + INIT[4051], INIT[2003], INIT[4050], INIT[2002], INIT[4049], INIT[2001], INIT[4048], INIT[2000], + INIT[4047], INIT[1999], INIT[4046], INIT[1998], INIT[4045], INIT[1997], INIT[4044], INIT[1996], + INIT[4043], INIT[1995], INIT[4042], INIT[1994], INIT[4041], INIT[1993], INIT[4040], INIT[1992], + INIT[4039], INIT[1991], INIT[4038], INIT[1990], INIT[4037], INIT[1989], INIT[4036], INIT[1988], + INIT[4035], INIT[1987], INIT[4034], INIT[1986], INIT[4033], INIT[1985], INIT[4032], INIT[1984], + INIT[4031], INIT[1983], INIT[4030], INIT[1982], INIT[4029], INIT[1981], INIT[4028], INIT[1980], + INIT[4027], INIT[1979], INIT[4026], INIT[1978], INIT[4025], INIT[1977], INIT[4024], INIT[1976], + INIT[4023], INIT[1975], INIT[4022], INIT[1974], INIT[4021], INIT[1973], INIT[4020], INIT[1972], + INIT[4019], INIT[1971], INIT[4018], INIT[1970], INIT[4017], INIT[1969], INIT[4016], INIT[1968], + INIT[4015], INIT[1967], INIT[4014], INIT[1966], INIT[4013], INIT[1965], INIT[4012], INIT[1964], + INIT[4011], INIT[1963], INIT[4010], INIT[1962], INIT[4009], INIT[1961], INIT[4008], INIT[1960], + INIT[4007], INIT[1959], INIT[4006], INIT[1958], INIT[4005], INIT[1957], INIT[4004], INIT[1956], + INIT[4003], INIT[1955], INIT[4002], INIT[1954], INIT[4001], INIT[1953], INIT[4000], INIT[1952], + INIT[3999], INIT[1951], INIT[3998], INIT[1950], INIT[3997], INIT[1949], INIT[3996], INIT[1948], + INIT[3995], INIT[1947], INIT[3994], INIT[1946], INIT[3993], INIT[1945], INIT[3992], INIT[1944], + INIT[3991], INIT[1943], INIT[3990], INIT[1942], INIT[3989], INIT[1941], INIT[3988], INIT[1940], + INIT[3987], INIT[1939], INIT[3986], INIT[1938], INIT[3985], INIT[1937], INIT[3984], INIT[1936], + INIT[3983], INIT[1935], INIT[3982], INIT[1934], INIT[3981], INIT[1933], INIT[3980], INIT[1932], + INIT[3979], INIT[1931], INIT[3978], INIT[1930], INIT[3977], INIT[1929], INIT[3976], INIT[1928], + INIT[3975], INIT[1927], INIT[3974], INIT[1926], INIT[3973], INIT[1925], INIT[3972], INIT[1924], + INIT[3971], INIT[1923], INIT[3970], INIT[1922], INIT[3969], INIT[1921], INIT[3968], INIT[1920] +}; diff --git a/verilog/windows/autoyosys/share/ice40/brams_init2.vh b/verilog/windows/autoyosys/share/ice40/brams_init2.vh new file mode 100644 index 0000000..2930d15 --- /dev/null +++ b/verilog/windows/autoyosys/share/ice40/brams_init2.vh @@ -0,0 +1,544 @@ +localparam [255:0] INIT_0 = { + INIT[3135], INIT[2111], INIT[1087], INIT[ 63], INIT[3134], INIT[2110], INIT[1086], INIT[ 62], + INIT[3133], INIT[2109], INIT[1085], INIT[ 61], INIT[3132], INIT[2108], INIT[1084], INIT[ 60], + INIT[3131], INIT[2107], INIT[1083], INIT[ 59], INIT[3130], INIT[2106], INIT[1082], INIT[ 58], + INIT[3129], INIT[2105], INIT[1081], INIT[ 57], INIT[3128], INIT[2104], INIT[1080], INIT[ 56], + INIT[3127], INIT[2103], INIT[1079], INIT[ 55], INIT[3126], INIT[2102], INIT[1078], INIT[ 54], + INIT[3125], INIT[2101], INIT[1077], INIT[ 53], INIT[3124], INIT[2100], INIT[1076], INIT[ 52], + INIT[3123], INIT[2099], INIT[1075], INIT[ 51], INIT[3122], INIT[2098], INIT[1074], INIT[ 50], + INIT[3121], INIT[2097], INIT[1073], INIT[ 49], INIT[3120], INIT[2096], INIT[1072], INIT[ 48], + INIT[3119], INIT[2095], INIT[1071], INIT[ 47], INIT[3118], INIT[2094], INIT[1070], INIT[ 46], + INIT[3117], INIT[2093], INIT[1069], INIT[ 45], INIT[3116], INIT[2092], INIT[1068], INIT[ 44], + INIT[3115], INIT[2091], INIT[1067], INIT[ 43], INIT[3114], INIT[2090], INIT[1066], INIT[ 42], + INIT[3113], INIT[2089], INIT[1065], INIT[ 41], INIT[3112], INIT[2088], INIT[1064], INIT[ 40], + INIT[3111], INIT[2087], INIT[1063], INIT[ 39], INIT[3110], INIT[2086], INIT[1062], INIT[ 38], + INIT[3109], INIT[2085], INIT[1061], INIT[ 37], INIT[3108], INIT[2084], INIT[1060], INIT[ 36], + INIT[3107], INIT[2083], INIT[1059], INIT[ 35], INIT[3106], INIT[2082], INIT[1058], INIT[ 34], + INIT[3105], INIT[2081], INIT[1057], INIT[ 33], INIT[3104], INIT[2080], INIT[1056], INIT[ 32], + INIT[3103], INIT[2079], INIT[1055], INIT[ 31], INIT[3102], INIT[2078], INIT[1054], INIT[ 30], + INIT[3101], INIT[2077], INIT[1053], INIT[ 29], INIT[3100], INIT[2076], INIT[1052], INIT[ 28], + INIT[3099], INIT[2075], INIT[1051], INIT[ 27], INIT[3098], INIT[2074], INIT[1050], INIT[ 26], + INIT[3097], INIT[2073], INIT[1049], INIT[ 25], INIT[3096], INIT[2072], INIT[1048], INIT[ 24], + INIT[3095], INIT[2071], INIT[1047], INIT[ 23], INIT[3094], INIT[2070], INIT[1046], INIT[ 22], + INIT[3093], INIT[2069], INIT[1045], INIT[ 21], INIT[3092], INIT[2068], INIT[1044], INIT[ 20], + INIT[3091], INIT[2067], INIT[1043], INIT[ 19], INIT[3090], INIT[2066], INIT[1042], INIT[ 18], + INIT[3089], INIT[2065], INIT[1041], INIT[ 17], INIT[3088], INIT[2064], INIT[1040], INIT[ 16], + INIT[3087], INIT[2063], INIT[1039], INIT[ 15], INIT[3086], INIT[2062], INIT[1038], INIT[ 14], + INIT[3085], INIT[2061], INIT[1037], INIT[ 13], INIT[3084], INIT[2060], INIT[1036], INIT[ 12], + INIT[3083], INIT[2059], INIT[1035], INIT[ 11], INIT[3082], INIT[2058], INIT[1034], INIT[ 10], + INIT[3081], INIT[2057], INIT[1033], INIT[ 9], INIT[3080], INIT[2056], INIT[1032], INIT[ 8], + INIT[3079], INIT[2055], INIT[1031], INIT[ 7], INIT[3078], INIT[2054], INIT[1030], INIT[ 6], + INIT[3077], INIT[2053], INIT[1029], INIT[ 5], INIT[3076], INIT[2052], INIT[1028], INIT[ 4], + INIT[3075], INIT[2051], INIT[1027], INIT[ 3], INIT[3074], INIT[2050], INIT[1026], INIT[ 2], + INIT[3073], INIT[2049], INIT[1025], INIT[ 1], INIT[3072], INIT[2048], INIT[1024], INIT[ 0] +}; +localparam [255:0] INIT_1 = { + INIT[3199], INIT[2175], INIT[1151], INIT[ 127], INIT[3198], INIT[2174], INIT[1150], INIT[ 126], + INIT[3197], INIT[2173], INIT[1149], INIT[ 125], INIT[3196], INIT[2172], INIT[1148], INIT[ 124], + INIT[3195], INIT[2171], INIT[1147], INIT[ 123], INIT[3194], INIT[2170], INIT[1146], INIT[ 122], + INIT[3193], INIT[2169], INIT[1145], INIT[ 121], INIT[3192], INIT[2168], INIT[1144], INIT[ 120], + INIT[3191], INIT[2167], INIT[1143], INIT[ 119], INIT[3190], INIT[2166], INIT[1142], INIT[ 118], + INIT[3189], INIT[2165], INIT[1141], INIT[ 117], INIT[3188], INIT[2164], INIT[1140], INIT[ 116], + INIT[3187], INIT[2163], INIT[1139], INIT[ 115], INIT[3186], INIT[2162], INIT[1138], INIT[ 114], + INIT[3185], INIT[2161], INIT[1137], INIT[ 113], INIT[3184], INIT[2160], INIT[1136], INIT[ 112], + INIT[3183], INIT[2159], INIT[1135], INIT[ 111], INIT[3182], INIT[2158], INIT[1134], INIT[ 110], + INIT[3181], INIT[2157], INIT[1133], INIT[ 109], INIT[3180], INIT[2156], INIT[1132], INIT[ 108], + INIT[3179], INIT[2155], INIT[1131], INIT[ 107], INIT[3178], INIT[2154], INIT[1130], INIT[ 106], + INIT[3177], INIT[2153], INIT[1129], INIT[ 105], INIT[3176], INIT[2152], INIT[1128], INIT[ 104], + INIT[3175], INIT[2151], INIT[1127], INIT[ 103], INIT[3174], INIT[2150], INIT[1126], INIT[ 102], + INIT[3173], INIT[2149], INIT[1125], INIT[ 101], INIT[3172], INIT[2148], INIT[1124], INIT[ 100], + INIT[3171], INIT[2147], INIT[1123], INIT[ 99], INIT[3170], INIT[2146], INIT[1122], INIT[ 98], + INIT[3169], INIT[2145], INIT[1121], INIT[ 97], INIT[3168], INIT[2144], INIT[1120], INIT[ 96], + INIT[3167], INIT[2143], INIT[1119], INIT[ 95], INIT[3166], INIT[2142], INIT[1118], INIT[ 94], + INIT[3165], INIT[2141], INIT[1117], INIT[ 93], INIT[3164], INIT[2140], INIT[1116], INIT[ 92], + INIT[3163], INIT[2139], INIT[1115], INIT[ 91], INIT[3162], INIT[2138], INIT[1114], INIT[ 90], + INIT[3161], INIT[2137], INIT[1113], INIT[ 89], INIT[3160], INIT[2136], INIT[1112], INIT[ 88], + INIT[3159], INIT[2135], INIT[1111], INIT[ 87], INIT[3158], INIT[2134], INIT[1110], INIT[ 86], + INIT[3157], INIT[2133], INIT[1109], INIT[ 85], INIT[3156], INIT[2132], INIT[1108], INIT[ 84], + INIT[3155], INIT[2131], INIT[1107], INIT[ 83], INIT[3154], INIT[2130], INIT[1106], INIT[ 82], + INIT[3153], INIT[2129], INIT[1105], INIT[ 81], INIT[3152], INIT[2128], INIT[1104], INIT[ 80], + INIT[3151], INIT[2127], INIT[1103], INIT[ 79], INIT[3150], INIT[2126], INIT[1102], INIT[ 78], + INIT[3149], INIT[2125], INIT[1101], INIT[ 77], INIT[3148], INIT[2124], INIT[1100], INIT[ 76], + INIT[3147], INIT[2123], INIT[1099], INIT[ 75], INIT[3146], INIT[2122], INIT[1098], INIT[ 74], + INIT[3145], INIT[2121], INIT[1097], INIT[ 73], INIT[3144], INIT[2120], INIT[1096], INIT[ 72], + INIT[3143], INIT[2119], INIT[1095], INIT[ 71], INIT[3142], INIT[2118], INIT[1094], INIT[ 70], + INIT[3141], INIT[2117], INIT[1093], INIT[ 69], INIT[3140], INIT[2116], INIT[1092], INIT[ 68], + INIT[3139], INIT[2115], INIT[1091], INIT[ 67], INIT[3138], INIT[2114], INIT[1090], INIT[ 66], + INIT[3137], INIT[2113], INIT[1089], INIT[ 65], INIT[3136], INIT[2112], INIT[1088], INIT[ 64] +}; +localparam [255:0] INIT_2 = { + INIT[3263], INIT[2239], INIT[1215], INIT[ 191], INIT[3262], INIT[2238], INIT[1214], INIT[ 190], + INIT[3261], INIT[2237], INIT[1213], INIT[ 189], INIT[3260], INIT[2236], INIT[1212], INIT[ 188], + INIT[3259], INIT[2235], INIT[1211], INIT[ 187], INIT[3258], INIT[2234], INIT[1210], INIT[ 186], + INIT[3257], INIT[2233], INIT[1209], INIT[ 185], INIT[3256], INIT[2232], INIT[1208], INIT[ 184], + INIT[3255], INIT[2231], INIT[1207], INIT[ 183], INIT[3254], INIT[2230], INIT[1206], INIT[ 182], + INIT[3253], INIT[2229], INIT[1205], INIT[ 181], INIT[3252], INIT[2228], INIT[1204], INIT[ 180], + INIT[3251], INIT[2227], INIT[1203], INIT[ 179], INIT[3250], INIT[2226], INIT[1202], INIT[ 178], + INIT[3249], INIT[2225], INIT[1201], INIT[ 177], INIT[3248], INIT[2224], INIT[1200], INIT[ 176], + INIT[3247], INIT[2223], INIT[1199], INIT[ 175], INIT[3246], INIT[2222], INIT[1198], INIT[ 174], + INIT[3245], INIT[2221], INIT[1197], INIT[ 173], INIT[3244], INIT[2220], INIT[1196], INIT[ 172], + INIT[3243], INIT[2219], INIT[1195], INIT[ 171], INIT[3242], INIT[2218], INIT[1194], INIT[ 170], + INIT[3241], INIT[2217], INIT[1193], INIT[ 169], INIT[3240], INIT[2216], INIT[1192], INIT[ 168], + INIT[3239], INIT[2215], INIT[1191], INIT[ 167], INIT[3238], INIT[2214], INIT[1190], INIT[ 166], + INIT[3237], INIT[2213], INIT[1189], INIT[ 165], INIT[3236], INIT[2212], INIT[1188], INIT[ 164], + INIT[3235], INIT[2211], INIT[1187], INIT[ 163], INIT[3234], INIT[2210], INIT[1186], INIT[ 162], + INIT[3233], INIT[2209], INIT[1185], INIT[ 161], INIT[3232], INIT[2208], INIT[1184], INIT[ 160], + INIT[3231], INIT[2207], INIT[1183], INIT[ 159], INIT[3230], INIT[2206], INIT[1182], INIT[ 158], + INIT[3229], INIT[2205], INIT[1181], INIT[ 157], INIT[3228], INIT[2204], INIT[1180], INIT[ 156], + INIT[3227], INIT[2203], INIT[1179], INIT[ 155], INIT[3226], INIT[2202], INIT[1178], INIT[ 154], + INIT[3225], INIT[2201], INIT[1177], INIT[ 153], INIT[3224], INIT[2200], INIT[1176], INIT[ 152], + INIT[3223], INIT[2199], INIT[1175], INIT[ 151], INIT[3222], INIT[2198], INIT[1174], INIT[ 150], + INIT[3221], INIT[2197], INIT[1173], INIT[ 149], INIT[3220], INIT[2196], INIT[1172], INIT[ 148], + INIT[3219], INIT[2195], INIT[1171], INIT[ 147], INIT[3218], INIT[2194], INIT[1170], INIT[ 146], + INIT[3217], INIT[2193], INIT[1169], INIT[ 145], INIT[3216], INIT[2192], INIT[1168], INIT[ 144], + INIT[3215], INIT[2191], INIT[1167], INIT[ 143], INIT[3214], INIT[2190], INIT[1166], INIT[ 142], + INIT[3213], INIT[2189], INIT[1165], INIT[ 141], INIT[3212], INIT[2188], INIT[1164], INIT[ 140], + INIT[3211], INIT[2187], INIT[1163], INIT[ 139], INIT[3210], INIT[2186], INIT[1162], INIT[ 138], + INIT[3209], INIT[2185], INIT[1161], INIT[ 137], INIT[3208], INIT[2184], INIT[1160], INIT[ 136], + INIT[3207], INIT[2183], INIT[1159], INIT[ 135], INIT[3206], INIT[2182], INIT[1158], INIT[ 134], + INIT[3205], INIT[2181], INIT[1157], INIT[ 133], INIT[3204], INIT[2180], INIT[1156], INIT[ 132], + INIT[3203], INIT[2179], INIT[1155], INIT[ 131], INIT[3202], INIT[2178], INIT[1154], INIT[ 130], + INIT[3201], INIT[2177], INIT[1153], INIT[ 129], INIT[3200], INIT[2176], INIT[1152], INIT[ 128] +}; +localparam [255:0] INIT_3 = { + INIT[3327], INIT[2303], INIT[1279], INIT[ 255], INIT[3326], INIT[2302], INIT[1278], INIT[ 254], + INIT[3325], INIT[2301], INIT[1277], INIT[ 253], INIT[3324], INIT[2300], INIT[1276], INIT[ 252], + INIT[3323], INIT[2299], INIT[1275], INIT[ 251], INIT[3322], INIT[2298], INIT[1274], INIT[ 250], + INIT[3321], INIT[2297], INIT[1273], INIT[ 249], INIT[3320], INIT[2296], INIT[1272], INIT[ 248], + INIT[3319], INIT[2295], INIT[1271], INIT[ 247], INIT[3318], INIT[2294], INIT[1270], INIT[ 246], + INIT[3317], INIT[2293], INIT[1269], INIT[ 245], INIT[3316], INIT[2292], INIT[1268], INIT[ 244], + INIT[3315], INIT[2291], INIT[1267], INIT[ 243], INIT[3314], INIT[2290], INIT[1266], INIT[ 242], + INIT[3313], INIT[2289], INIT[1265], INIT[ 241], INIT[3312], INIT[2288], INIT[1264], INIT[ 240], + INIT[3311], INIT[2287], INIT[1263], INIT[ 239], INIT[3310], INIT[2286], INIT[1262], INIT[ 238], + INIT[3309], INIT[2285], INIT[1261], INIT[ 237], INIT[3308], INIT[2284], INIT[1260], INIT[ 236], + INIT[3307], INIT[2283], INIT[1259], INIT[ 235], INIT[3306], INIT[2282], INIT[1258], INIT[ 234], + INIT[3305], INIT[2281], INIT[1257], INIT[ 233], INIT[3304], INIT[2280], INIT[1256], INIT[ 232], + INIT[3303], INIT[2279], INIT[1255], INIT[ 231], INIT[3302], INIT[2278], INIT[1254], INIT[ 230], + INIT[3301], INIT[2277], INIT[1253], INIT[ 229], INIT[3300], INIT[2276], INIT[1252], INIT[ 228], + INIT[3299], INIT[2275], INIT[1251], INIT[ 227], INIT[3298], INIT[2274], INIT[1250], INIT[ 226], + INIT[3297], INIT[2273], INIT[1249], INIT[ 225], INIT[3296], INIT[2272], INIT[1248], INIT[ 224], + INIT[3295], INIT[2271], INIT[1247], INIT[ 223], INIT[3294], INIT[2270], INIT[1246], INIT[ 222], + INIT[3293], INIT[2269], INIT[1245], INIT[ 221], INIT[3292], INIT[2268], INIT[1244], INIT[ 220], + INIT[3291], INIT[2267], INIT[1243], INIT[ 219], INIT[3290], INIT[2266], INIT[1242], INIT[ 218], + INIT[3289], INIT[2265], INIT[1241], INIT[ 217], INIT[3288], INIT[2264], INIT[1240], INIT[ 216], + INIT[3287], INIT[2263], INIT[1239], INIT[ 215], INIT[3286], INIT[2262], INIT[1238], INIT[ 214], + INIT[3285], INIT[2261], INIT[1237], INIT[ 213], INIT[3284], INIT[2260], INIT[1236], INIT[ 212], + INIT[3283], INIT[2259], INIT[1235], INIT[ 211], INIT[3282], INIT[2258], INIT[1234], INIT[ 210], + INIT[3281], INIT[2257], INIT[1233], INIT[ 209], INIT[3280], INIT[2256], INIT[1232], INIT[ 208], + INIT[3279], INIT[2255], INIT[1231], INIT[ 207], INIT[3278], INIT[2254], INIT[1230], INIT[ 206], + INIT[3277], INIT[2253], INIT[1229], INIT[ 205], INIT[3276], INIT[2252], INIT[1228], INIT[ 204], + INIT[3275], INIT[2251], INIT[1227], INIT[ 203], INIT[3274], INIT[2250], INIT[1226], INIT[ 202], + INIT[3273], INIT[2249], INIT[1225], INIT[ 201], INIT[3272], INIT[2248], INIT[1224], INIT[ 200], + INIT[3271], INIT[2247], INIT[1223], INIT[ 199], INIT[3270], INIT[2246], INIT[1222], INIT[ 198], + INIT[3269], INIT[2245], INIT[1221], INIT[ 197], INIT[3268], INIT[2244], INIT[1220], INIT[ 196], + INIT[3267], INIT[2243], INIT[1219], INIT[ 195], INIT[3266], INIT[2242], INIT[1218], INIT[ 194], + INIT[3265], INIT[2241], INIT[1217], INIT[ 193], INIT[3264], INIT[2240], INIT[1216], INIT[ 192] +}; +localparam [255:0] INIT_4 = { + INIT[3391], INIT[2367], INIT[1343], INIT[ 319], INIT[3390], INIT[2366], INIT[1342], INIT[ 318], + INIT[3389], INIT[2365], INIT[1341], INIT[ 317], INIT[3388], INIT[2364], INIT[1340], INIT[ 316], + INIT[3387], INIT[2363], INIT[1339], INIT[ 315], INIT[3386], INIT[2362], INIT[1338], INIT[ 314], + INIT[3385], INIT[2361], INIT[1337], INIT[ 313], INIT[3384], INIT[2360], INIT[1336], INIT[ 312], + INIT[3383], INIT[2359], INIT[1335], INIT[ 311], INIT[3382], INIT[2358], INIT[1334], INIT[ 310], + INIT[3381], INIT[2357], INIT[1333], INIT[ 309], INIT[3380], INIT[2356], INIT[1332], INIT[ 308], + INIT[3379], INIT[2355], INIT[1331], INIT[ 307], INIT[3378], INIT[2354], INIT[1330], INIT[ 306], + INIT[3377], INIT[2353], INIT[1329], INIT[ 305], INIT[3376], INIT[2352], INIT[1328], INIT[ 304], + INIT[3375], INIT[2351], INIT[1327], INIT[ 303], INIT[3374], INIT[2350], INIT[1326], INIT[ 302], + INIT[3373], INIT[2349], INIT[1325], INIT[ 301], INIT[3372], INIT[2348], INIT[1324], INIT[ 300], + INIT[3371], INIT[2347], INIT[1323], INIT[ 299], INIT[3370], INIT[2346], INIT[1322], INIT[ 298], + INIT[3369], INIT[2345], INIT[1321], INIT[ 297], INIT[3368], INIT[2344], INIT[1320], INIT[ 296], + INIT[3367], INIT[2343], INIT[1319], INIT[ 295], INIT[3366], INIT[2342], INIT[1318], INIT[ 294], + INIT[3365], INIT[2341], INIT[1317], INIT[ 293], INIT[3364], INIT[2340], INIT[1316], INIT[ 292], + INIT[3363], INIT[2339], INIT[1315], INIT[ 291], INIT[3362], INIT[2338], INIT[1314], INIT[ 290], + INIT[3361], INIT[2337], INIT[1313], INIT[ 289], INIT[3360], INIT[2336], INIT[1312], INIT[ 288], + INIT[3359], INIT[2335], INIT[1311], INIT[ 287], INIT[3358], INIT[2334], INIT[1310], INIT[ 286], + INIT[3357], INIT[2333], INIT[1309], INIT[ 285], INIT[3356], INIT[2332], INIT[1308], INIT[ 284], + INIT[3355], INIT[2331], INIT[1307], INIT[ 283], INIT[3354], INIT[2330], INIT[1306], INIT[ 282], + INIT[3353], INIT[2329], INIT[1305], INIT[ 281], INIT[3352], INIT[2328], INIT[1304], INIT[ 280], + INIT[3351], INIT[2327], INIT[1303], INIT[ 279], INIT[3350], INIT[2326], INIT[1302], INIT[ 278], + INIT[3349], INIT[2325], INIT[1301], INIT[ 277], INIT[3348], INIT[2324], INIT[1300], INIT[ 276], + INIT[3347], INIT[2323], INIT[1299], INIT[ 275], INIT[3346], INIT[2322], INIT[1298], INIT[ 274], + INIT[3345], INIT[2321], INIT[1297], INIT[ 273], INIT[3344], INIT[2320], INIT[1296], INIT[ 272], + INIT[3343], INIT[2319], INIT[1295], INIT[ 271], INIT[3342], INIT[2318], INIT[1294], INIT[ 270], + INIT[3341], INIT[2317], INIT[1293], INIT[ 269], INIT[3340], INIT[2316], INIT[1292], INIT[ 268], + INIT[3339], INIT[2315], INIT[1291], INIT[ 267], INIT[3338], INIT[2314], INIT[1290], INIT[ 266], + INIT[3337], INIT[2313], INIT[1289], INIT[ 265], INIT[3336], INIT[2312], INIT[1288], INIT[ 264], + INIT[3335], INIT[2311], INIT[1287], INIT[ 263], INIT[3334], INIT[2310], INIT[1286], INIT[ 262], + INIT[3333], INIT[2309], INIT[1285], INIT[ 261], INIT[3332], INIT[2308], INIT[1284], INIT[ 260], + INIT[3331], INIT[2307], INIT[1283], INIT[ 259], INIT[3330], INIT[2306], INIT[1282], INIT[ 258], + INIT[3329], INIT[2305], INIT[1281], INIT[ 257], INIT[3328], INIT[2304], INIT[1280], INIT[ 256] +}; +localparam [255:0] INIT_5 = { + INIT[3455], INIT[2431], INIT[1407], INIT[ 383], INIT[3454], INIT[2430], INIT[1406], INIT[ 382], + INIT[3453], INIT[2429], INIT[1405], INIT[ 381], INIT[3452], INIT[2428], INIT[1404], INIT[ 380], + INIT[3451], INIT[2427], INIT[1403], INIT[ 379], INIT[3450], INIT[2426], INIT[1402], INIT[ 378], + INIT[3449], INIT[2425], INIT[1401], INIT[ 377], INIT[3448], INIT[2424], INIT[1400], INIT[ 376], + INIT[3447], INIT[2423], INIT[1399], INIT[ 375], INIT[3446], INIT[2422], INIT[1398], INIT[ 374], + INIT[3445], INIT[2421], INIT[1397], INIT[ 373], INIT[3444], INIT[2420], INIT[1396], INIT[ 372], + INIT[3443], INIT[2419], INIT[1395], INIT[ 371], INIT[3442], INIT[2418], INIT[1394], INIT[ 370], + INIT[3441], INIT[2417], INIT[1393], INIT[ 369], INIT[3440], INIT[2416], INIT[1392], INIT[ 368], + INIT[3439], INIT[2415], INIT[1391], INIT[ 367], INIT[3438], INIT[2414], INIT[1390], INIT[ 366], + INIT[3437], INIT[2413], INIT[1389], INIT[ 365], INIT[3436], INIT[2412], INIT[1388], INIT[ 364], + INIT[3435], INIT[2411], INIT[1387], INIT[ 363], INIT[3434], INIT[2410], INIT[1386], INIT[ 362], + INIT[3433], INIT[2409], INIT[1385], INIT[ 361], INIT[3432], INIT[2408], INIT[1384], INIT[ 360], + INIT[3431], INIT[2407], INIT[1383], INIT[ 359], INIT[3430], INIT[2406], INIT[1382], INIT[ 358], + INIT[3429], INIT[2405], INIT[1381], INIT[ 357], INIT[3428], INIT[2404], INIT[1380], INIT[ 356], + INIT[3427], INIT[2403], INIT[1379], INIT[ 355], INIT[3426], INIT[2402], INIT[1378], INIT[ 354], + INIT[3425], INIT[2401], INIT[1377], INIT[ 353], INIT[3424], INIT[2400], INIT[1376], INIT[ 352], + INIT[3423], INIT[2399], INIT[1375], INIT[ 351], INIT[3422], INIT[2398], INIT[1374], INIT[ 350], + INIT[3421], INIT[2397], INIT[1373], INIT[ 349], INIT[3420], INIT[2396], INIT[1372], INIT[ 348], + INIT[3419], INIT[2395], INIT[1371], INIT[ 347], INIT[3418], INIT[2394], INIT[1370], INIT[ 346], + INIT[3417], INIT[2393], INIT[1369], INIT[ 345], INIT[3416], INIT[2392], INIT[1368], INIT[ 344], + INIT[3415], INIT[2391], INIT[1367], INIT[ 343], INIT[3414], INIT[2390], INIT[1366], INIT[ 342], + INIT[3413], INIT[2389], INIT[1365], INIT[ 341], INIT[3412], INIT[2388], INIT[1364], INIT[ 340], + INIT[3411], INIT[2387], INIT[1363], INIT[ 339], INIT[3410], INIT[2386], INIT[1362], INIT[ 338], + INIT[3409], INIT[2385], INIT[1361], INIT[ 337], INIT[3408], INIT[2384], INIT[1360], INIT[ 336], + INIT[3407], INIT[2383], INIT[1359], INIT[ 335], INIT[3406], INIT[2382], INIT[1358], INIT[ 334], + INIT[3405], INIT[2381], INIT[1357], INIT[ 333], INIT[3404], INIT[2380], INIT[1356], INIT[ 332], + INIT[3403], INIT[2379], INIT[1355], INIT[ 331], INIT[3402], INIT[2378], INIT[1354], INIT[ 330], + INIT[3401], INIT[2377], INIT[1353], INIT[ 329], INIT[3400], INIT[2376], INIT[1352], INIT[ 328], + INIT[3399], INIT[2375], INIT[1351], INIT[ 327], INIT[3398], INIT[2374], INIT[1350], INIT[ 326], + INIT[3397], INIT[2373], INIT[1349], INIT[ 325], INIT[3396], INIT[2372], INIT[1348], INIT[ 324], + INIT[3395], INIT[2371], INIT[1347], INIT[ 323], INIT[3394], INIT[2370], INIT[1346], INIT[ 322], + INIT[3393], INIT[2369], INIT[1345], INIT[ 321], INIT[3392], INIT[2368], INIT[1344], INIT[ 320] +}; +localparam [255:0] INIT_6 = { + INIT[3519], INIT[2495], INIT[1471], INIT[ 447], INIT[3518], INIT[2494], INIT[1470], INIT[ 446], + INIT[3517], INIT[2493], INIT[1469], INIT[ 445], INIT[3516], INIT[2492], INIT[1468], INIT[ 444], + INIT[3515], INIT[2491], INIT[1467], INIT[ 443], INIT[3514], INIT[2490], INIT[1466], INIT[ 442], + INIT[3513], INIT[2489], INIT[1465], INIT[ 441], INIT[3512], INIT[2488], INIT[1464], INIT[ 440], + INIT[3511], INIT[2487], INIT[1463], INIT[ 439], INIT[3510], INIT[2486], INIT[1462], INIT[ 438], + INIT[3509], INIT[2485], INIT[1461], INIT[ 437], INIT[3508], INIT[2484], INIT[1460], INIT[ 436], + INIT[3507], INIT[2483], INIT[1459], INIT[ 435], INIT[3506], INIT[2482], INIT[1458], INIT[ 434], + INIT[3505], INIT[2481], INIT[1457], INIT[ 433], INIT[3504], INIT[2480], INIT[1456], INIT[ 432], + INIT[3503], INIT[2479], INIT[1455], INIT[ 431], INIT[3502], INIT[2478], INIT[1454], INIT[ 430], + INIT[3501], INIT[2477], INIT[1453], INIT[ 429], INIT[3500], INIT[2476], INIT[1452], INIT[ 428], + INIT[3499], INIT[2475], INIT[1451], INIT[ 427], INIT[3498], INIT[2474], INIT[1450], INIT[ 426], + INIT[3497], INIT[2473], INIT[1449], INIT[ 425], INIT[3496], INIT[2472], INIT[1448], INIT[ 424], + INIT[3495], INIT[2471], INIT[1447], INIT[ 423], INIT[3494], INIT[2470], INIT[1446], INIT[ 422], + INIT[3493], INIT[2469], INIT[1445], INIT[ 421], INIT[3492], INIT[2468], INIT[1444], INIT[ 420], + INIT[3491], INIT[2467], INIT[1443], INIT[ 419], INIT[3490], INIT[2466], INIT[1442], INIT[ 418], + INIT[3489], INIT[2465], INIT[1441], INIT[ 417], INIT[3488], INIT[2464], INIT[1440], INIT[ 416], + INIT[3487], INIT[2463], INIT[1439], INIT[ 415], INIT[3486], INIT[2462], INIT[1438], INIT[ 414], + INIT[3485], INIT[2461], INIT[1437], INIT[ 413], INIT[3484], INIT[2460], INIT[1436], INIT[ 412], + INIT[3483], INIT[2459], INIT[1435], INIT[ 411], INIT[3482], INIT[2458], INIT[1434], INIT[ 410], + INIT[3481], INIT[2457], INIT[1433], INIT[ 409], INIT[3480], INIT[2456], INIT[1432], INIT[ 408], + INIT[3479], INIT[2455], INIT[1431], INIT[ 407], INIT[3478], INIT[2454], INIT[1430], INIT[ 406], + INIT[3477], INIT[2453], INIT[1429], INIT[ 405], INIT[3476], INIT[2452], INIT[1428], INIT[ 404], + INIT[3475], INIT[2451], INIT[1427], INIT[ 403], INIT[3474], INIT[2450], INIT[1426], INIT[ 402], + INIT[3473], INIT[2449], INIT[1425], INIT[ 401], INIT[3472], INIT[2448], INIT[1424], INIT[ 400], + INIT[3471], INIT[2447], INIT[1423], INIT[ 399], INIT[3470], INIT[2446], INIT[1422], INIT[ 398], + INIT[3469], INIT[2445], INIT[1421], INIT[ 397], INIT[3468], INIT[2444], INIT[1420], INIT[ 396], + INIT[3467], INIT[2443], INIT[1419], INIT[ 395], INIT[3466], INIT[2442], INIT[1418], INIT[ 394], + INIT[3465], INIT[2441], INIT[1417], INIT[ 393], INIT[3464], INIT[2440], INIT[1416], INIT[ 392], + INIT[3463], INIT[2439], INIT[1415], INIT[ 391], INIT[3462], INIT[2438], INIT[1414], INIT[ 390], + INIT[3461], INIT[2437], INIT[1413], INIT[ 389], INIT[3460], INIT[2436], INIT[1412], INIT[ 388], + INIT[3459], INIT[2435], INIT[1411], INIT[ 387], INIT[3458], INIT[2434], INIT[1410], INIT[ 386], + INIT[3457], INIT[2433], INIT[1409], INIT[ 385], INIT[3456], INIT[2432], INIT[1408], INIT[ 384] +}; +localparam [255:0] INIT_7 = { + INIT[3583], INIT[2559], INIT[1535], INIT[ 511], INIT[3582], INIT[2558], INIT[1534], INIT[ 510], + INIT[3581], INIT[2557], INIT[1533], INIT[ 509], INIT[3580], INIT[2556], INIT[1532], INIT[ 508], + INIT[3579], INIT[2555], INIT[1531], INIT[ 507], INIT[3578], INIT[2554], INIT[1530], INIT[ 506], + INIT[3577], INIT[2553], INIT[1529], INIT[ 505], INIT[3576], INIT[2552], INIT[1528], INIT[ 504], + INIT[3575], INIT[2551], INIT[1527], INIT[ 503], INIT[3574], INIT[2550], INIT[1526], INIT[ 502], + INIT[3573], INIT[2549], INIT[1525], INIT[ 501], INIT[3572], INIT[2548], INIT[1524], INIT[ 500], + INIT[3571], INIT[2547], INIT[1523], INIT[ 499], INIT[3570], INIT[2546], INIT[1522], INIT[ 498], + INIT[3569], INIT[2545], INIT[1521], INIT[ 497], INIT[3568], INIT[2544], INIT[1520], INIT[ 496], + INIT[3567], INIT[2543], INIT[1519], INIT[ 495], INIT[3566], INIT[2542], INIT[1518], INIT[ 494], + INIT[3565], INIT[2541], INIT[1517], INIT[ 493], INIT[3564], INIT[2540], INIT[1516], INIT[ 492], + INIT[3563], INIT[2539], INIT[1515], INIT[ 491], INIT[3562], INIT[2538], INIT[1514], INIT[ 490], + INIT[3561], INIT[2537], INIT[1513], INIT[ 489], INIT[3560], INIT[2536], INIT[1512], INIT[ 488], + INIT[3559], INIT[2535], INIT[1511], INIT[ 487], INIT[3558], INIT[2534], INIT[1510], INIT[ 486], + INIT[3557], INIT[2533], INIT[1509], INIT[ 485], INIT[3556], INIT[2532], INIT[1508], INIT[ 484], + INIT[3555], INIT[2531], INIT[1507], INIT[ 483], INIT[3554], INIT[2530], INIT[1506], INIT[ 482], + INIT[3553], INIT[2529], INIT[1505], INIT[ 481], INIT[3552], INIT[2528], INIT[1504], INIT[ 480], + INIT[3551], INIT[2527], INIT[1503], INIT[ 479], INIT[3550], INIT[2526], INIT[1502], INIT[ 478], + INIT[3549], INIT[2525], INIT[1501], INIT[ 477], INIT[3548], INIT[2524], INIT[1500], INIT[ 476], + INIT[3547], INIT[2523], INIT[1499], INIT[ 475], INIT[3546], INIT[2522], INIT[1498], INIT[ 474], + INIT[3545], INIT[2521], INIT[1497], INIT[ 473], INIT[3544], INIT[2520], INIT[1496], INIT[ 472], + INIT[3543], INIT[2519], INIT[1495], INIT[ 471], INIT[3542], INIT[2518], INIT[1494], INIT[ 470], + INIT[3541], INIT[2517], INIT[1493], INIT[ 469], INIT[3540], INIT[2516], INIT[1492], INIT[ 468], + INIT[3539], INIT[2515], INIT[1491], INIT[ 467], INIT[3538], INIT[2514], INIT[1490], INIT[ 466], + INIT[3537], INIT[2513], INIT[1489], INIT[ 465], INIT[3536], INIT[2512], INIT[1488], INIT[ 464], + INIT[3535], INIT[2511], INIT[1487], INIT[ 463], INIT[3534], INIT[2510], INIT[1486], INIT[ 462], + INIT[3533], INIT[2509], INIT[1485], INIT[ 461], INIT[3532], INIT[2508], INIT[1484], INIT[ 460], + INIT[3531], INIT[2507], INIT[1483], INIT[ 459], INIT[3530], INIT[2506], INIT[1482], INIT[ 458], + INIT[3529], INIT[2505], INIT[1481], INIT[ 457], INIT[3528], INIT[2504], INIT[1480], INIT[ 456], + INIT[3527], INIT[2503], INIT[1479], INIT[ 455], INIT[3526], INIT[2502], INIT[1478], INIT[ 454], + INIT[3525], INIT[2501], INIT[1477], INIT[ 453], INIT[3524], INIT[2500], INIT[1476], INIT[ 452], + INIT[3523], INIT[2499], INIT[1475], INIT[ 451], INIT[3522], INIT[2498], INIT[1474], INIT[ 450], + INIT[3521], INIT[2497], INIT[1473], INIT[ 449], INIT[3520], INIT[2496], INIT[1472], INIT[ 448] +}; +localparam [255:0] INIT_8 = { + INIT[3647], INIT[2623], INIT[1599], INIT[ 575], INIT[3646], INIT[2622], INIT[1598], INIT[ 574], + INIT[3645], INIT[2621], INIT[1597], INIT[ 573], INIT[3644], INIT[2620], INIT[1596], INIT[ 572], + INIT[3643], INIT[2619], INIT[1595], INIT[ 571], INIT[3642], INIT[2618], INIT[1594], INIT[ 570], + INIT[3641], INIT[2617], INIT[1593], INIT[ 569], INIT[3640], INIT[2616], INIT[1592], INIT[ 568], + INIT[3639], INIT[2615], INIT[1591], INIT[ 567], INIT[3638], INIT[2614], INIT[1590], INIT[ 566], + INIT[3637], INIT[2613], INIT[1589], INIT[ 565], INIT[3636], INIT[2612], INIT[1588], INIT[ 564], + INIT[3635], INIT[2611], INIT[1587], INIT[ 563], INIT[3634], INIT[2610], INIT[1586], INIT[ 562], + INIT[3633], INIT[2609], INIT[1585], INIT[ 561], INIT[3632], INIT[2608], INIT[1584], INIT[ 560], + INIT[3631], INIT[2607], INIT[1583], INIT[ 559], INIT[3630], INIT[2606], INIT[1582], INIT[ 558], + INIT[3629], INIT[2605], INIT[1581], INIT[ 557], INIT[3628], INIT[2604], INIT[1580], INIT[ 556], + INIT[3627], INIT[2603], INIT[1579], INIT[ 555], INIT[3626], INIT[2602], INIT[1578], INIT[ 554], + INIT[3625], INIT[2601], INIT[1577], INIT[ 553], INIT[3624], INIT[2600], INIT[1576], INIT[ 552], + INIT[3623], INIT[2599], INIT[1575], INIT[ 551], INIT[3622], INIT[2598], INIT[1574], INIT[ 550], + INIT[3621], INIT[2597], INIT[1573], INIT[ 549], INIT[3620], INIT[2596], INIT[1572], INIT[ 548], + INIT[3619], INIT[2595], INIT[1571], INIT[ 547], INIT[3618], INIT[2594], INIT[1570], INIT[ 546], + INIT[3617], INIT[2593], INIT[1569], INIT[ 545], INIT[3616], INIT[2592], INIT[1568], INIT[ 544], + INIT[3615], INIT[2591], INIT[1567], INIT[ 543], INIT[3614], INIT[2590], INIT[1566], INIT[ 542], + INIT[3613], INIT[2589], INIT[1565], INIT[ 541], INIT[3612], INIT[2588], INIT[1564], INIT[ 540], + INIT[3611], INIT[2587], INIT[1563], INIT[ 539], INIT[3610], INIT[2586], INIT[1562], INIT[ 538], + INIT[3609], INIT[2585], INIT[1561], INIT[ 537], INIT[3608], INIT[2584], INIT[1560], INIT[ 536], + INIT[3607], INIT[2583], INIT[1559], INIT[ 535], INIT[3606], INIT[2582], INIT[1558], INIT[ 534], + INIT[3605], INIT[2581], INIT[1557], INIT[ 533], INIT[3604], INIT[2580], INIT[1556], INIT[ 532], + INIT[3603], INIT[2579], INIT[1555], INIT[ 531], INIT[3602], INIT[2578], INIT[1554], INIT[ 530], + INIT[3601], INIT[2577], INIT[1553], INIT[ 529], INIT[3600], INIT[2576], INIT[1552], INIT[ 528], + INIT[3599], INIT[2575], INIT[1551], INIT[ 527], INIT[3598], INIT[2574], INIT[1550], INIT[ 526], + INIT[3597], INIT[2573], INIT[1549], INIT[ 525], INIT[3596], INIT[2572], INIT[1548], INIT[ 524], + INIT[3595], INIT[2571], INIT[1547], INIT[ 523], INIT[3594], INIT[2570], INIT[1546], INIT[ 522], + INIT[3593], INIT[2569], INIT[1545], INIT[ 521], INIT[3592], INIT[2568], INIT[1544], INIT[ 520], + INIT[3591], INIT[2567], INIT[1543], INIT[ 519], INIT[3590], INIT[2566], INIT[1542], INIT[ 518], + INIT[3589], INIT[2565], INIT[1541], INIT[ 517], INIT[3588], INIT[2564], INIT[1540], INIT[ 516], + INIT[3587], INIT[2563], INIT[1539], INIT[ 515], INIT[3586], INIT[2562], INIT[1538], INIT[ 514], + INIT[3585], INIT[2561], INIT[1537], INIT[ 513], INIT[3584], INIT[2560], INIT[1536], INIT[ 512] +}; +localparam [255:0] INIT_9 = { + INIT[3711], INIT[2687], INIT[1663], INIT[ 639], INIT[3710], INIT[2686], INIT[1662], INIT[ 638], + INIT[3709], INIT[2685], INIT[1661], INIT[ 637], INIT[3708], INIT[2684], INIT[1660], INIT[ 636], + INIT[3707], INIT[2683], INIT[1659], INIT[ 635], INIT[3706], INIT[2682], INIT[1658], INIT[ 634], + INIT[3705], INIT[2681], INIT[1657], INIT[ 633], INIT[3704], INIT[2680], INIT[1656], INIT[ 632], + INIT[3703], INIT[2679], INIT[1655], INIT[ 631], INIT[3702], INIT[2678], INIT[1654], INIT[ 630], + INIT[3701], INIT[2677], INIT[1653], INIT[ 629], INIT[3700], INIT[2676], INIT[1652], INIT[ 628], + INIT[3699], INIT[2675], INIT[1651], INIT[ 627], INIT[3698], INIT[2674], INIT[1650], INIT[ 626], + INIT[3697], INIT[2673], INIT[1649], INIT[ 625], INIT[3696], INIT[2672], INIT[1648], INIT[ 624], + INIT[3695], INIT[2671], INIT[1647], INIT[ 623], INIT[3694], INIT[2670], INIT[1646], INIT[ 622], + INIT[3693], INIT[2669], INIT[1645], INIT[ 621], INIT[3692], INIT[2668], INIT[1644], INIT[ 620], + INIT[3691], INIT[2667], INIT[1643], INIT[ 619], INIT[3690], INIT[2666], INIT[1642], INIT[ 618], + INIT[3689], INIT[2665], INIT[1641], INIT[ 617], INIT[3688], INIT[2664], INIT[1640], INIT[ 616], + INIT[3687], INIT[2663], INIT[1639], INIT[ 615], INIT[3686], INIT[2662], INIT[1638], INIT[ 614], + INIT[3685], INIT[2661], INIT[1637], INIT[ 613], INIT[3684], INIT[2660], INIT[1636], INIT[ 612], + INIT[3683], INIT[2659], INIT[1635], INIT[ 611], INIT[3682], INIT[2658], INIT[1634], INIT[ 610], + INIT[3681], INIT[2657], INIT[1633], INIT[ 609], INIT[3680], INIT[2656], INIT[1632], INIT[ 608], + INIT[3679], INIT[2655], INIT[1631], INIT[ 607], INIT[3678], INIT[2654], INIT[1630], INIT[ 606], + INIT[3677], INIT[2653], INIT[1629], INIT[ 605], INIT[3676], INIT[2652], INIT[1628], INIT[ 604], + INIT[3675], INIT[2651], INIT[1627], INIT[ 603], INIT[3674], INIT[2650], INIT[1626], INIT[ 602], + INIT[3673], INIT[2649], INIT[1625], INIT[ 601], INIT[3672], INIT[2648], INIT[1624], INIT[ 600], + INIT[3671], INIT[2647], INIT[1623], INIT[ 599], INIT[3670], INIT[2646], INIT[1622], INIT[ 598], + INIT[3669], INIT[2645], INIT[1621], INIT[ 597], INIT[3668], INIT[2644], INIT[1620], INIT[ 596], + INIT[3667], INIT[2643], INIT[1619], INIT[ 595], INIT[3666], INIT[2642], INIT[1618], INIT[ 594], + INIT[3665], INIT[2641], INIT[1617], INIT[ 593], INIT[3664], INIT[2640], INIT[1616], INIT[ 592], + INIT[3663], INIT[2639], INIT[1615], INIT[ 591], INIT[3662], INIT[2638], INIT[1614], INIT[ 590], + INIT[3661], INIT[2637], INIT[1613], INIT[ 589], INIT[3660], INIT[2636], INIT[1612], INIT[ 588], + INIT[3659], INIT[2635], INIT[1611], INIT[ 587], INIT[3658], INIT[2634], INIT[1610], INIT[ 586], + INIT[3657], INIT[2633], INIT[1609], INIT[ 585], INIT[3656], INIT[2632], INIT[1608], INIT[ 584], + INIT[3655], INIT[2631], INIT[1607], INIT[ 583], INIT[3654], INIT[2630], INIT[1606], INIT[ 582], + INIT[3653], INIT[2629], INIT[1605], INIT[ 581], INIT[3652], INIT[2628], INIT[1604], INIT[ 580], + INIT[3651], INIT[2627], INIT[1603], INIT[ 579], INIT[3650], INIT[2626], INIT[1602], INIT[ 578], + INIT[3649], INIT[2625], INIT[1601], INIT[ 577], INIT[3648], INIT[2624], INIT[1600], INIT[ 576] +}; +localparam [255:0] INIT_A = { + INIT[3775], INIT[2751], INIT[1727], INIT[ 703], INIT[3774], INIT[2750], INIT[1726], INIT[ 702], + INIT[3773], INIT[2749], INIT[1725], INIT[ 701], INIT[3772], INIT[2748], INIT[1724], INIT[ 700], + INIT[3771], INIT[2747], INIT[1723], INIT[ 699], INIT[3770], INIT[2746], INIT[1722], INIT[ 698], + INIT[3769], INIT[2745], INIT[1721], INIT[ 697], INIT[3768], INIT[2744], INIT[1720], INIT[ 696], + INIT[3767], INIT[2743], INIT[1719], INIT[ 695], INIT[3766], INIT[2742], INIT[1718], INIT[ 694], + INIT[3765], INIT[2741], INIT[1717], INIT[ 693], INIT[3764], INIT[2740], INIT[1716], INIT[ 692], + INIT[3763], INIT[2739], INIT[1715], INIT[ 691], INIT[3762], INIT[2738], INIT[1714], INIT[ 690], + INIT[3761], INIT[2737], INIT[1713], INIT[ 689], INIT[3760], INIT[2736], INIT[1712], INIT[ 688], + INIT[3759], INIT[2735], INIT[1711], INIT[ 687], INIT[3758], INIT[2734], INIT[1710], INIT[ 686], + INIT[3757], INIT[2733], INIT[1709], INIT[ 685], INIT[3756], INIT[2732], INIT[1708], INIT[ 684], + INIT[3755], INIT[2731], INIT[1707], INIT[ 683], INIT[3754], INIT[2730], INIT[1706], INIT[ 682], + INIT[3753], INIT[2729], INIT[1705], INIT[ 681], INIT[3752], INIT[2728], INIT[1704], INIT[ 680], + INIT[3751], INIT[2727], INIT[1703], INIT[ 679], INIT[3750], INIT[2726], INIT[1702], INIT[ 678], + INIT[3749], INIT[2725], INIT[1701], INIT[ 677], INIT[3748], INIT[2724], INIT[1700], INIT[ 676], + INIT[3747], INIT[2723], INIT[1699], INIT[ 675], INIT[3746], INIT[2722], INIT[1698], INIT[ 674], + INIT[3745], INIT[2721], INIT[1697], INIT[ 673], INIT[3744], INIT[2720], INIT[1696], INIT[ 672], + INIT[3743], INIT[2719], INIT[1695], INIT[ 671], INIT[3742], INIT[2718], INIT[1694], INIT[ 670], + INIT[3741], INIT[2717], INIT[1693], INIT[ 669], INIT[3740], INIT[2716], INIT[1692], INIT[ 668], + INIT[3739], INIT[2715], INIT[1691], INIT[ 667], INIT[3738], INIT[2714], INIT[1690], INIT[ 666], + INIT[3737], INIT[2713], INIT[1689], INIT[ 665], INIT[3736], INIT[2712], INIT[1688], INIT[ 664], + INIT[3735], INIT[2711], INIT[1687], INIT[ 663], INIT[3734], INIT[2710], INIT[1686], INIT[ 662], + INIT[3733], INIT[2709], INIT[1685], INIT[ 661], INIT[3732], INIT[2708], INIT[1684], INIT[ 660], + INIT[3731], INIT[2707], INIT[1683], INIT[ 659], INIT[3730], INIT[2706], INIT[1682], INIT[ 658], + INIT[3729], INIT[2705], INIT[1681], INIT[ 657], INIT[3728], INIT[2704], INIT[1680], INIT[ 656], + INIT[3727], INIT[2703], INIT[1679], INIT[ 655], INIT[3726], INIT[2702], INIT[1678], INIT[ 654], + INIT[3725], INIT[2701], INIT[1677], INIT[ 653], INIT[3724], INIT[2700], INIT[1676], INIT[ 652], + INIT[3723], INIT[2699], INIT[1675], INIT[ 651], INIT[3722], INIT[2698], INIT[1674], INIT[ 650], + INIT[3721], INIT[2697], INIT[1673], INIT[ 649], INIT[3720], INIT[2696], INIT[1672], INIT[ 648], + INIT[3719], INIT[2695], INIT[1671], INIT[ 647], INIT[3718], INIT[2694], INIT[1670], INIT[ 646], + INIT[3717], INIT[2693], INIT[1669], INIT[ 645], INIT[3716], INIT[2692], INIT[1668], INIT[ 644], + INIT[3715], INIT[2691], INIT[1667], INIT[ 643], INIT[3714], INIT[2690], INIT[1666], INIT[ 642], + INIT[3713], INIT[2689], INIT[1665], INIT[ 641], INIT[3712], INIT[2688], INIT[1664], INIT[ 640] +}; +localparam [255:0] INIT_B = { + INIT[3839], INIT[2815], INIT[1791], INIT[ 767], INIT[3838], INIT[2814], INIT[1790], INIT[ 766], + INIT[3837], INIT[2813], INIT[1789], INIT[ 765], INIT[3836], INIT[2812], INIT[1788], INIT[ 764], + INIT[3835], INIT[2811], INIT[1787], INIT[ 763], INIT[3834], INIT[2810], INIT[1786], INIT[ 762], + INIT[3833], INIT[2809], INIT[1785], INIT[ 761], INIT[3832], INIT[2808], INIT[1784], INIT[ 760], + INIT[3831], INIT[2807], INIT[1783], INIT[ 759], INIT[3830], INIT[2806], INIT[1782], INIT[ 758], + INIT[3829], INIT[2805], INIT[1781], INIT[ 757], INIT[3828], INIT[2804], INIT[1780], INIT[ 756], + INIT[3827], INIT[2803], INIT[1779], INIT[ 755], INIT[3826], INIT[2802], INIT[1778], INIT[ 754], + INIT[3825], INIT[2801], INIT[1777], INIT[ 753], INIT[3824], INIT[2800], INIT[1776], INIT[ 752], + INIT[3823], INIT[2799], INIT[1775], INIT[ 751], INIT[3822], INIT[2798], INIT[1774], INIT[ 750], + INIT[3821], INIT[2797], INIT[1773], INIT[ 749], INIT[3820], INIT[2796], INIT[1772], INIT[ 748], + INIT[3819], INIT[2795], INIT[1771], INIT[ 747], INIT[3818], INIT[2794], INIT[1770], INIT[ 746], + INIT[3817], INIT[2793], INIT[1769], INIT[ 745], INIT[3816], INIT[2792], INIT[1768], INIT[ 744], + INIT[3815], INIT[2791], INIT[1767], INIT[ 743], INIT[3814], INIT[2790], INIT[1766], INIT[ 742], + INIT[3813], INIT[2789], INIT[1765], INIT[ 741], INIT[3812], INIT[2788], INIT[1764], INIT[ 740], + INIT[3811], INIT[2787], INIT[1763], INIT[ 739], INIT[3810], INIT[2786], INIT[1762], INIT[ 738], + INIT[3809], INIT[2785], INIT[1761], INIT[ 737], INIT[3808], INIT[2784], INIT[1760], INIT[ 736], + INIT[3807], INIT[2783], INIT[1759], INIT[ 735], INIT[3806], INIT[2782], INIT[1758], INIT[ 734], + INIT[3805], INIT[2781], INIT[1757], INIT[ 733], INIT[3804], INIT[2780], INIT[1756], INIT[ 732], + INIT[3803], INIT[2779], INIT[1755], INIT[ 731], INIT[3802], INIT[2778], INIT[1754], INIT[ 730], + INIT[3801], INIT[2777], INIT[1753], INIT[ 729], INIT[3800], INIT[2776], INIT[1752], INIT[ 728], + INIT[3799], INIT[2775], INIT[1751], INIT[ 727], INIT[3798], INIT[2774], INIT[1750], INIT[ 726], + INIT[3797], INIT[2773], INIT[1749], INIT[ 725], INIT[3796], INIT[2772], INIT[1748], INIT[ 724], + INIT[3795], INIT[2771], INIT[1747], INIT[ 723], INIT[3794], INIT[2770], INIT[1746], INIT[ 722], + INIT[3793], INIT[2769], INIT[1745], INIT[ 721], INIT[3792], INIT[2768], INIT[1744], INIT[ 720], + INIT[3791], INIT[2767], INIT[1743], INIT[ 719], INIT[3790], INIT[2766], INIT[1742], INIT[ 718], + INIT[3789], INIT[2765], INIT[1741], INIT[ 717], INIT[3788], INIT[2764], INIT[1740], INIT[ 716], + INIT[3787], INIT[2763], INIT[1739], INIT[ 715], INIT[3786], INIT[2762], INIT[1738], INIT[ 714], + INIT[3785], INIT[2761], INIT[1737], INIT[ 713], INIT[3784], INIT[2760], INIT[1736], INIT[ 712], + INIT[3783], INIT[2759], INIT[1735], INIT[ 711], INIT[3782], INIT[2758], INIT[1734], INIT[ 710], + INIT[3781], INIT[2757], INIT[1733], INIT[ 709], INIT[3780], INIT[2756], INIT[1732], INIT[ 708], + INIT[3779], INIT[2755], INIT[1731], INIT[ 707], INIT[3778], INIT[2754], INIT[1730], INIT[ 706], + INIT[3777], INIT[2753], INIT[1729], INIT[ 705], INIT[3776], INIT[2752], INIT[1728], INIT[ 704] +}; +localparam [255:0] INIT_C = { + INIT[3903], INIT[2879], INIT[1855], INIT[ 831], INIT[3902], INIT[2878], INIT[1854], INIT[ 830], + INIT[3901], INIT[2877], INIT[1853], INIT[ 829], INIT[3900], INIT[2876], INIT[1852], INIT[ 828], + INIT[3899], INIT[2875], INIT[1851], INIT[ 827], INIT[3898], INIT[2874], INIT[1850], INIT[ 826], + INIT[3897], INIT[2873], INIT[1849], INIT[ 825], INIT[3896], INIT[2872], INIT[1848], INIT[ 824], + INIT[3895], INIT[2871], INIT[1847], INIT[ 823], INIT[3894], INIT[2870], INIT[1846], INIT[ 822], + INIT[3893], INIT[2869], INIT[1845], INIT[ 821], INIT[3892], INIT[2868], INIT[1844], INIT[ 820], + INIT[3891], INIT[2867], INIT[1843], INIT[ 819], INIT[3890], INIT[2866], INIT[1842], INIT[ 818], + INIT[3889], INIT[2865], INIT[1841], INIT[ 817], INIT[3888], INIT[2864], INIT[1840], INIT[ 816], + INIT[3887], INIT[2863], INIT[1839], INIT[ 815], INIT[3886], INIT[2862], INIT[1838], INIT[ 814], + INIT[3885], INIT[2861], INIT[1837], INIT[ 813], INIT[3884], INIT[2860], INIT[1836], INIT[ 812], + INIT[3883], INIT[2859], INIT[1835], INIT[ 811], INIT[3882], INIT[2858], INIT[1834], INIT[ 810], + INIT[3881], INIT[2857], INIT[1833], INIT[ 809], INIT[3880], INIT[2856], INIT[1832], INIT[ 808], + INIT[3879], INIT[2855], INIT[1831], INIT[ 807], INIT[3878], INIT[2854], INIT[1830], INIT[ 806], + INIT[3877], INIT[2853], INIT[1829], INIT[ 805], INIT[3876], INIT[2852], INIT[1828], INIT[ 804], + INIT[3875], INIT[2851], INIT[1827], INIT[ 803], INIT[3874], INIT[2850], INIT[1826], INIT[ 802], + INIT[3873], INIT[2849], INIT[1825], INIT[ 801], INIT[3872], INIT[2848], INIT[1824], INIT[ 800], + INIT[3871], INIT[2847], INIT[1823], INIT[ 799], INIT[3870], INIT[2846], INIT[1822], INIT[ 798], + INIT[3869], INIT[2845], INIT[1821], INIT[ 797], INIT[3868], INIT[2844], INIT[1820], INIT[ 796], + INIT[3867], INIT[2843], INIT[1819], INIT[ 795], INIT[3866], INIT[2842], INIT[1818], INIT[ 794], + INIT[3865], INIT[2841], INIT[1817], INIT[ 793], INIT[3864], INIT[2840], INIT[1816], INIT[ 792], + INIT[3863], INIT[2839], INIT[1815], INIT[ 791], INIT[3862], INIT[2838], INIT[1814], INIT[ 790], + INIT[3861], INIT[2837], INIT[1813], INIT[ 789], INIT[3860], INIT[2836], INIT[1812], INIT[ 788], + INIT[3859], INIT[2835], INIT[1811], INIT[ 787], INIT[3858], INIT[2834], INIT[1810], INIT[ 786], + INIT[3857], INIT[2833], INIT[1809], INIT[ 785], INIT[3856], INIT[2832], INIT[1808], INIT[ 784], + INIT[3855], INIT[2831], INIT[1807], INIT[ 783], INIT[3854], INIT[2830], INIT[1806], INIT[ 782], + INIT[3853], INIT[2829], INIT[1805], INIT[ 781], INIT[3852], INIT[2828], INIT[1804], INIT[ 780], + INIT[3851], INIT[2827], INIT[1803], INIT[ 779], INIT[3850], INIT[2826], INIT[1802], INIT[ 778], + INIT[3849], INIT[2825], INIT[1801], INIT[ 777], INIT[3848], INIT[2824], INIT[1800], INIT[ 776], + INIT[3847], INIT[2823], INIT[1799], INIT[ 775], INIT[3846], INIT[2822], INIT[1798], INIT[ 774], + INIT[3845], INIT[2821], INIT[1797], INIT[ 773], INIT[3844], INIT[2820], INIT[1796], INIT[ 772], + INIT[3843], INIT[2819], INIT[1795], INIT[ 771], INIT[3842], INIT[2818], INIT[1794], INIT[ 770], + INIT[3841], INIT[2817], INIT[1793], INIT[ 769], INIT[3840], INIT[2816], INIT[1792], INIT[ 768] +}; +localparam [255:0] INIT_D = { + INIT[3967], INIT[2943], INIT[1919], INIT[ 895], INIT[3966], INIT[2942], INIT[1918], INIT[ 894], + INIT[3965], INIT[2941], INIT[1917], INIT[ 893], INIT[3964], INIT[2940], INIT[1916], INIT[ 892], + INIT[3963], INIT[2939], INIT[1915], INIT[ 891], INIT[3962], INIT[2938], INIT[1914], INIT[ 890], + INIT[3961], INIT[2937], INIT[1913], INIT[ 889], INIT[3960], INIT[2936], INIT[1912], INIT[ 888], + INIT[3959], INIT[2935], INIT[1911], INIT[ 887], INIT[3958], INIT[2934], INIT[1910], INIT[ 886], + INIT[3957], INIT[2933], INIT[1909], INIT[ 885], INIT[3956], INIT[2932], INIT[1908], INIT[ 884], + INIT[3955], INIT[2931], INIT[1907], INIT[ 883], INIT[3954], INIT[2930], INIT[1906], INIT[ 882], + INIT[3953], INIT[2929], INIT[1905], INIT[ 881], INIT[3952], INIT[2928], INIT[1904], INIT[ 880], + INIT[3951], INIT[2927], INIT[1903], INIT[ 879], INIT[3950], INIT[2926], INIT[1902], INIT[ 878], + INIT[3949], INIT[2925], INIT[1901], INIT[ 877], INIT[3948], INIT[2924], INIT[1900], INIT[ 876], + INIT[3947], INIT[2923], INIT[1899], INIT[ 875], INIT[3946], INIT[2922], INIT[1898], INIT[ 874], + INIT[3945], INIT[2921], INIT[1897], INIT[ 873], INIT[3944], INIT[2920], INIT[1896], INIT[ 872], + INIT[3943], INIT[2919], INIT[1895], INIT[ 871], INIT[3942], INIT[2918], INIT[1894], INIT[ 870], + INIT[3941], INIT[2917], INIT[1893], INIT[ 869], INIT[3940], INIT[2916], INIT[1892], INIT[ 868], + INIT[3939], INIT[2915], INIT[1891], INIT[ 867], INIT[3938], INIT[2914], INIT[1890], INIT[ 866], + INIT[3937], INIT[2913], INIT[1889], INIT[ 865], INIT[3936], INIT[2912], INIT[1888], INIT[ 864], + INIT[3935], INIT[2911], INIT[1887], INIT[ 863], INIT[3934], INIT[2910], INIT[1886], INIT[ 862], + INIT[3933], INIT[2909], INIT[1885], INIT[ 861], INIT[3932], INIT[2908], INIT[1884], INIT[ 860], + INIT[3931], INIT[2907], INIT[1883], INIT[ 859], INIT[3930], INIT[2906], INIT[1882], INIT[ 858], + INIT[3929], INIT[2905], INIT[1881], INIT[ 857], INIT[3928], INIT[2904], INIT[1880], INIT[ 856], + INIT[3927], INIT[2903], INIT[1879], INIT[ 855], INIT[3926], INIT[2902], INIT[1878], INIT[ 854], + INIT[3925], INIT[2901], INIT[1877], INIT[ 853], INIT[3924], INIT[2900], INIT[1876], INIT[ 852], + INIT[3923], INIT[2899], INIT[1875], INIT[ 851], INIT[3922], INIT[2898], INIT[1874], INIT[ 850], + INIT[3921], INIT[2897], INIT[1873], INIT[ 849], INIT[3920], INIT[2896], INIT[1872], INIT[ 848], + INIT[3919], INIT[2895], INIT[1871], INIT[ 847], INIT[3918], INIT[2894], INIT[1870], INIT[ 846], + INIT[3917], INIT[2893], INIT[1869], INIT[ 845], INIT[3916], INIT[2892], INIT[1868], INIT[ 844], + INIT[3915], INIT[2891], INIT[1867], INIT[ 843], INIT[3914], INIT[2890], INIT[1866], INIT[ 842], + INIT[3913], INIT[2889], INIT[1865], INIT[ 841], INIT[3912], INIT[2888], INIT[1864], INIT[ 840], + INIT[3911], INIT[2887], INIT[1863], INIT[ 839], INIT[3910], INIT[2886], INIT[1862], INIT[ 838], + INIT[3909], INIT[2885], INIT[1861], INIT[ 837], INIT[3908], INIT[2884], INIT[1860], INIT[ 836], + INIT[3907], INIT[2883], INIT[1859], INIT[ 835], INIT[3906], INIT[2882], INIT[1858], INIT[ 834], + INIT[3905], INIT[2881], INIT[1857], INIT[ 833], INIT[3904], INIT[2880], INIT[1856], INIT[ 832] +}; +localparam [255:0] INIT_E = { + INIT[4031], INIT[3007], INIT[1983], INIT[ 959], INIT[4030], INIT[3006], INIT[1982], INIT[ 958], + INIT[4029], INIT[3005], INIT[1981], INIT[ 957], INIT[4028], INIT[3004], INIT[1980], INIT[ 956], + INIT[4027], INIT[3003], INIT[1979], INIT[ 955], INIT[4026], INIT[3002], INIT[1978], INIT[ 954], + INIT[4025], INIT[3001], INIT[1977], INIT[ 953], INIT[4024], INIT[3000], INIT[1976], INIT[ 952], + INIT[4023], INIT[2999], INIT[1975], INIT[ 951], INIT[4022], INIT[2998], INIT[1974], INIT[ 950], + INIT[4021], INIT[2997], INIT[1973], INIT[ 949], INIT[4020], INIT[2996], INIT[1972], INIT[ 948], + INIT[4019], INIT[2995], INIT[1971], INIT[ 947], INIT[4018], INIT[2994], INIT[1970], INIT[ 946], + INIT[4017], INIT[2993], INIT[1969], INIT[ 945], INIT[4016], INIT[2992], INIT[1968], INIT[ 944], + INIT[4015], INIT[2991], INIT[1967], INIT[ 943], INIT[4014], INIT[2990], INIT[1966], INIT[ 942], + INIT[4013], INIT[2989], INIT[1965], INIT[ 941], INIT[4012], INIT[2988], INIT[1964], INIT[ 940], + INIT[4011], INIT[2987], INIT[1963], INIT[ 939], INIT[4010], INIT[2986], INIT[1962], INIT[ 938], + INIT[4009], INIT[2985], INIT[1961], INIT[ 937], INIT[4008], INIT[2984], INIT[1960], INIT[ 936], + INIT[4007], INIT[2983], INIT[1959], INIT[ 935], INIT[4006], INIT[2982], INIT[1958], INIT[ 934], + INIT[4005], INIT[2981], INIT[1957], INIT[ 933], INIT[4004], INIT[2980], INIT[1956], INIT[ 932], + INIT[4003], INIT[2979], INIT[1955], INIT[ 931], INIT[4002], INIT[2978], INIT[1954], INIT[ 930], + INIT[4001], INIT[2977], INIT[1953], INIT[ 929], INIT[4000], INIT[2976], INIT[1952], INIT[ 928], + INIT[3999], INIT[2975], INIT[1951], INIT[ 927], INIT[3998], INIT[2974], INIT[1950], INIT[ 926], + INIT[3997], INIT[2973], INIT[1949], INIT[ 925], INIT[3996], INIT[2972], INIT[1948], INIT[ 924], + INIT[3995], INIT[2971], INIT[1947], INIT[ 923], INIT[3994], INIT[2970], INIT[1946], INIT[ 922], + INIT[3993], INIT[2969], INIT[1945], INIT[ 921], INIT[3992], INIT[2968], INIT[1944], INIT[ 920], + INIT[3991], INIT[2967], INIT[1943], INIT[ 919], INIT[3990], INIT[2966], INIT[1942], INIT[ 918], + INIT[3989], INIT[2965], INIT[1941], INIT[ 917], INIT[3988], INIT[2964], INIT[1940], INIT[ 916], + INIT[3987], INIT[2963], INIT[1939], INIT[ 915], INIT[3986], INIT[2962], INIT[1938], INIT[ 914], + INIT[3985], INIT[2961], INIT[1937], INIT[ 913], INIT[3984], INIT[2960], INIT[1936], INIT[ 912], + INIT[3983], INIT[2959], INIT[1935], INIT[ 911], INIT[3982], INIT[2958], INIT[1934], INIT[ 910], + INIT[3981], INIT[2957], INIT[1933], INIT[ 909], INIT[3980], INIT[2956], INIT[1932], INIT[ 908], + INIT[3979], INIT[2955], INIT[1931], INIT[ 907], INIT[3978], INIT[2954], INIT[1930], INIT[ 906], + INIT[3977], INIT[2953], INIT[1929], INIT[ 905], INIT[3976], INIT[2952], INIT[1928], INIT[ 904], + INIT[3975], INIT[2951], INIT[1927], INIT[ 903], INIT[3974], INIT[2950], INIT[1926], INIT[ 902], + INIT[3973], INIT[2949], INIT[1925], INIT[ 901], INIT[3972], INIT[2948], INIT[1924], INIT[ 900], + INIT[3971], INIT[2947], INIT[1923], INIT[ 899], INIT[3970], INIT[2946], INIT[1922], INIT[ 898], + INIT[3969], INIT[2945], INIT[1921], INIT[ 897], INIT[3968], INIT[2944], INIT[1920], INIT[ 896] +}; +localparam [255:0] INIT_F = { + INIT[4095], INIT[3071], INIT[2047], INIT[1023], INIT[4094], INIT[3070], INIT[2046], INIT[1022], + INIT[4093], INIT[3069], INIT[2045], INIT[1021], INIT[4092], INIT[3068], INIT[2044], INIT[1020], + INIT[4091], INIT[3067], INIT[2043], INIT[1019], INIT[4090], INIT[3066], INIT[2042], INIT[1018], + INIT[4089], INIT[3065], INIT[2041], INIT[1017], INIT[4088], INIT[3064], INIT[2040], INIT[1016], + INIT[4087], INIT[3063], INIT[2039], INIT[1015], INIT[4086], INIT[3062], INIT[2038], INIT[1014], + INIT[4085], INIT[3061], INIT[2037], INIT[1013], INIT[4084], INIT[3060], INIT[2036], INIT[1012], + INIT[4083], INIT[3059], INIT[2035], INIT[1011], INIT[4082], INIT[3058], INIT[2034], INIT[1010], + INIT[4081], INIT[3057], INIT[2033], INIT[1009], INIT[4080], INIT[3056], INIT[2032], INIT[1008], + INIT[4079], INIT[3055], INIT[2031], INIT[1007], INIT[4078], INIT[3054], INIT[2030], INIT[1006], + INIT[4077], INIT[3053], INIT[2029], INIT[1005], INIT[4076], INIT[3052], INIT[2028], INIT[1004], + INIT[4075], INIT[3051], INIT[2027], INIT[1003], INIT[4074], INIT[3050], INIT[2026], INIT[1002], + INIT[4073], INIT[3049], INIT[2025], INIT[1001], INIT[4072], INIT[3048], INIT[2024], INIT[1000], + INIT[4071], INIT[3047], INIT[2023], INIT[ 999], INIT[4070], INIT[3046], INIT[2022], INIT[ 998], + INIT[4069], INIT[3045], INIT[2021], INIT[ 997], INIT[4068], INIT[3044], INIT[2020], INIT[ 996], + INIT[4067], INIT[3043], INIT[2019], INIT[ 995], INIT[4066], INIT[3042], INIT[2018], INIT[ 994], + INIT[4065], INIT[3041], INIT[2017], INIT[ 993], INIT[4064], INIT[3040], INIT[2016], INIT[ 992], + INIT[4063], INIT[3039], INIT[2015], INIT[ 991], INIT[4062], INIT[3038], INIT[2014], INIT[ 990], + INIT[4061], INIT[3037], INIT[2013], INIT[ 989], INIT[4060], INIT[3036], INIT[2012], INIT[ 988], + INIT[4059], INIT[3035], INIT[2011], INIT[ 987], INIT[4058], INIT[3034], INIT[2010], INIT[ 986], + INIT[4057], INIT[3033], INIT[2009], INIT[ 985], INIT[4056], INIT[3032], INIT[2008], INIT[ 984], + INIT[4055], INIT[3031], INIT[2007], INIT[ 983], INIT[4054], INIT[3030], INIT[2006], INIT[ 982], + INIT[4053], INIT[3029], INIT[2005], INIT[ 981], INIT[4052], INIT[3028], INIT[2004], INIT[ 980], + INIT[4051], INIT[3027], INIT[2003], INIT[ 979], INIT[4050], INIT[3026], INIT[2002], INIT[ 978], + INIT[4049], INIT[3025], INIT[2001], INIT[ 977], INIT[4048], INIT[3024], INIT[2000], INIT[ 976], + INIT[4047], INIT[3023], INIT[1999], INIT[ 975], INIT[4046], INIT[3022], INIT[1998], INIT[ 974], + INIT[4045], INIT[3021], INIT[1997], INIT[ 973], INIT[4044], INIT[3020], INIT[1996], INIT[ 972], + INIT[4043], INIT[3019], INIT[1995], INIT[ 971], INIT[4042], INIT[3018], INIT[1994], INIT[ 970], + INIT[4041], INIT[3017], INIT[1993], INIT[ 969], INIT[4040], INIT[3016], INIT[1992], INIT[ 968], + INIT[4039], INIT[3015], INIT[1991], INIT[ 967], INIT[4038], INIT[3014], INIT[1990], INIT[ 966], + INIT[4037], INIT[3013], INIT[1989], INIT[ 965], INIT[4036], INIT[3012], INIT[1988], INIT[ 964], + INIT[4035], INIT[3011], INIT[1987], INIT[ 963], INIT[4034], INIT[3010], INIT[1986], INIT[ 962], + INIT[4033], INIT[3009], INIT[1985], INIT[ 961], INIT[4032], INIT[3008], INIT[1984], INIT[ 960] +}; diff --git a/verilog/windows/autoyosys/share/ice40/brams_init3.vh b/verilog/windows/autoyosys/share/ice40/brams_init3.vh new file mode 100644 index 0000000..29e4a5d --- /dev/null +++ b/verilog/windows/autoyosys/share/ice40/brams_init3.vh @@ -0,0 +1,544 @@ +localparam [255:0] INIT_0 = { + INIT[3615], INIT[3103], INIT[2591], INIT[2079], INIT[1567], INIT[1055], INIT[ 543], INIT[ 31], + INIT[3614], INIT[3102], INIT[2590], INIT[2078], INIT[1566], INIT[1054], INIT[ 542], INIT[ 30], + INIT[3613], INIT[3101], INIT[2589], INIT[2077], INIT[1565], INIT[1053], INIT[ 541], INIT[ 29], + INIT[3612], INIT[3100], INIT[2588], INIT[2076], INIT[1564], INIT[1052], INIT[ 540], INIT[ 28], + INIT[3611], INIT[3099], INIT[2587], INIT[2075], INIT[1563], INIT[1051], INIT[ 539], INIT[ 27], + INIT[3610], INIT[3098], INIT[2586], INIT[2074], INIT[1562], INIT[1050], INIT[ 538], INIT[ 26], + INIT[3609], INIT[3097], INIT[2585], INIT[2073], INIT[1561], INIT[1049], INIT[ 537], INIT[ 25], + INIT[3608], INIT[3096], INIT[2584], INIT[2072], INIT[1560], INIT[1048], INIT[ 536], INIT[ 24], + INIT[3607], INIT[3095], INIT[2583], INIT[2071], INIT[1559], INIT[1047], INIT[ 535], INIT[ 23], + INIT[3606], INIT[3094], INIT[2582], INIT[2070], INIT[1558], INIT[1046], INIT[ 534], INIT[ 22], + INIT[3605], INIT[3093], INIT[2581], INIT[2069], INIT[1557], INIT[1045], INIT[ 533], INIT[ 21], + INIT[3604], INIT[3092], INIT[2580], INIT[2068], INIT[1556], INIT[1044], INIT[ 532], INIT[ 20], + INIT[3603], INIT[3091], INIT[2579], INIT[2067], INIT[1555], INIT[1043], INIT[ 531], INIT[ 19], + INIT[3602], INIT[3090], INIT[2578], INIT[2066], INIT[1554], INIT[1042], INIT[ 530], INIT[ 18], + INIT[3601], INIT[3089], INIT[2577], INIT[2065], INIT[1553], INIT[1041], INIT[ 529], INIT[ 17], + INIT[3600], INIT[3088], INIT[2576], INIT[2064], INIT[1552], INIT[1040], INIT[ 528], INIT[ 16], + INIT[3599], INIT[3087], INIT[2575], INIT[2063], INIT[1551], INIT[1039], INIT[ 527], INIT[ 15], + INIT[3598], INIT[3086], INIT[2574], INIT[2062], INIT[1550], INIT[1038], INIT[ 526], INIT[ 14], + INIT[3597], INIT[3085], INIT[2573], INIT[2061], INIT[1549], INIT[1037], INIT[ 525], INIT[ 13], + INIT[3596], INIT[3084], INIT[2572], INIT[2060], INIT[1548], INIT[1036], INIT[ 524], INIT[ 12], + INIT[3595], INIT[3083], INIT[2571], INIT[2059], INIT[1547], INIT[1035], INIT[ 523], INIT[ 11], + INIT[3594], INIT[3082], INIT[2570], INIT[2058], INIT[1546], INIT[1034], INIT[ 522], INIT[ 10], + INIT[3593], INIT[3081], INIT[2569], INIT[2057], INIT[1545], INIT[1033], INIT[ 521], INIT[ 9], + INIT[3592], INIT[3080], INIT[2568], INIT[2056], INIT[1544], INIT[1032], INIT[ 520], INIT[ 8], + INIT[3591], INIT[3079], INIT[2567], INIT[2055], INIT[1543], INIT[1031], INIT[ 519], INIT[ 7], + INIT[3590], INIT[3078], INIT[2566], INIT[2054], INIT[1542], INIT[1030], INIT[ 518], INIT[ 6], + INIT[3589], INIT[3077], INIT[2565], INIT[2053], INIT[1541], INIT[1029], INIT[ 517], INIT[ 5], + INIT[3588], INIT[3076], INIT[2564], INIT[2052], INIT[1540], INIT[1028], INIT[ 516], INIT[ 4], + INIT[3587], INIT[3075], INIT[2563], INIT[2051], INIT[1539], INIT[1027], INIT[ 515], INIT[ 3], + INIT[3586], INIT[3074], INIT[2562], INIT[2050], INIT[1538], INIT[1026], INIT[ 514], INIT[ 2], + INIT[3585], INIT[3073], INIT[2561], INIT[2049], INIT[1537], INIT[1025], INIT[ 513], INIT[ 1], + INIT[3584], INIT[3072], INIT[2560], INIT[2048], INIT[1536], INIT[1024], INIT[ 512], INIT[ 0] +}; +localparam [255:0] INIT_1 = { + INIT[3647], INIT[3135], INIT[2623], INIT[2111], INIT[1599], INIT[1087], INIT[ 575], INIT[ 63], + INIT[3646], INIT[3134], INIT[2622], INIT[2110], INIT[1598], INIT[1086], INIT[ 574], INIT[ 62], + INIT[3645], INIT[3133], INIT[2621], INIT[2109], INIT[1597], INIT[1085], INIT[ 573], INIT[ 61], + INIT[3644], INIT[3132], INIT[2620], INIT[2108], INIT[1596], INIT[1084], INIT[ 572], INIT[ 60], + INIT[3643], INIT[3131], INIT[2619], INIT[2107], INIT[1595], INIT[1083], INIT[ 571], INIT[ 59], + INIT[3642], INIT[3130], INIT[2618], INIT[2106], INIT[1594], INIT[1082], INIT[ 570], INIT[ 58], + INIT[3641], INIT[3129], INIT[2617], INIT[2105], INIT[1593], INIT[1081], INIT[ 569], INIT[ 57], + INIT[3640], INIT[3128], INIT[2616], INIT[2104], INIT[1592], INIT[1080], INIT[ 568], INIT[ 56], + INIT[3639], INIT[3127], INIT[2615], INIT[2103], INIT[1591], INIT[1079], INIT[ 567], INIT[ 55], + INIT[3638], INIT[3126], INIT[2614], INIT[2102], INIT[1590], INIT[1078], INIT[ 566], INIT[ 54], + INIT[3637], INIT[3125], INIT[2613], INIT[2101], INIT[1589], INIT[1077], INIT[ 565], INIT[ 53], + INIT[3636], INIT[3124], INIT[2612], INIT[2100], INIT[1588], INIT[1076], INIT[ 564], INIT[ 52], + INIT[3635], INIT[3123], INIT[2611], INIT[2099], INIT[1587], INIT[1075], INIT[ 563], INIT[ 51], + INIT[3634], INIT[3122], INIT[2610], INIT[2098], INIT[1586], INIT[1074], INIT[ 562], INIT[ 50], + INIT[3633], INIT[3121], INIT[2609], INIT[2097], INIT[1585], INIT[1073], INIT[ 561], INIT[ 49], + INIT[3632], INIT[3120], INIT[2608], INIT[2096], INIT[1584], INIT[1072], INIT[ 560], INIT[ 48], + INIT[3631], INIT[3119], INIT[2607], INIT[2095], INIT[1583], INIT[1071], INIT[ 559], INIT[ 47], + INIT[3630], INIT[3118], INIT[2606], INIT[2094], INIT[1582], INIT[1070], INIT[ 558], INIT[ 46], + INIT[3629], INIT[3117], INIT[2605], INIT[2093], INIT[1581], INIT[1069], INIT[ 557], INIT[ 45], + INIT[3628], INIT[3116], INIT[2604], INIT[2092], INIT[1580], INIT[1068], INIT[ 556], INIT[ 44], + INIT[3627], INIT[3115], INIT[2603], INIT[2091], INIT[1579], INIT[1067], INIT[ 555], INIT[ 43], + INIT[3626], INIT[3114], INIT[2602], INIT[2090], INIT[1578], INIT[1066], INIT[ 554], INIT[ 42], + INIT[3625], INIT[3113], INIT[2601], INIT[2089], INIT[1577], INIT[1065], INIT[ 553], INIT[ 41], + INIT[3624], INIT[3112], INIT[2600], INIT[2088], INIT[1576], INIT[1064], INIT[ 552], INIT[ 40], + INIT[3623], INIT[3111], INIT[2599], INIT[2087], INIT[1575], INIT[1063], INIT[ 551], INIT[ 39], + INIT[3622], INIT[3110], INIT[2598], INIT[2086], INIT[1574], INIT[1062], INIT[ 550], INIT[ 38], + INIT[3621], INIT[3109], INIT[2597], INIT[2085], INIT[1573], INIT[1061], INIT[ 549], INIT[ 37], + INIT[3620], INIT[3108], INIT[2596], INIT[2084], INIT[1572], INIT[1060], INIT[ 548], INIT[ 36], + INIT[3619], INIT[3107], INIT[2595], INIT[2083], INIT[1571], INIT[1059], INIT[ 547], INIT[ 35], + INIT[3618], INIT[3106], INIT[2594], INIT[2082], INIT[1570], INIT[1058], INIT[ 546], INIT[ 34], + INIT[3617], INIT[3105], INIT[2593], INIT[2081], INIT[1569], INIT[1057], INIT[ 545], INIT[ 33], + INIT[3616], INIT[3104], INIT[2592], INIT[2080], INIT[1568], INIT[1056], INIT[ 544], INIT[ 32] +}; +localparam [255:0] INIT_2 = { + INIT[3679], INIT[3167], INIT[2655], INIT[2143], INIT[1631], INIT[1119], INIT[ 607], INIT[ 95], + INIT[3678], INIT[3166], INIT[2654], INIT[2142], INIT[1630], INIT[1118], INIT[ 606], INIT[ 94], + INIT[3677], INIT[3165], INIT[2653], INIT[2141], INIT[1629], INIT[1117], INIT[ 605], INIT[ 93], + INIT[3676], INIT[3164], INIT[2652], INIT[2140], INIT[1628], INIT[1116], INIT[ 604], INIT[ 92], + INIT[3675], INIT[3163], INIT[2651], INIT[2139], INIT[1627], INIT[1115], INIT[ 603], INIT[ 91], + INIT[3674], INIT[3162], INIT[2650], INIT[2138], INIT[1626], INIT[1114], INIT[ 602], INIT[ 90], + INIT[3673], INIT[3161], INIT[2649], INIT[2137], INIT[1625], INIT[1113], INIT[ 601], INIT[ 89], + INIT[3672], INIT[3160], INIT[2648], INIT[2136], INIT[1624], INIT[1112], INIT[ 600], INIT[ 88], + INIT[3671], INIT[3159], INIT[2647], INIT[2135], INIT[1623], INIT[1111], INIT[ 599], INIT[ 87], + INIT[3670], INIT[3158], INIT[2646], INIT[2134], INIT[1622], INIT[1110], INIT[ 598], INIT[ 86], + INIT[3669], INIT[3157], INIT[2645], INIT[2133], INIT[1621], INIT[1109], INIT[ 597], INIT[ 85], + INIT[3668], INIT[3156], INIT[2644], INIT[2132], INIT[1620], INIT[1108], INIT[ 596], INIT[ 84], + INIT[3667], INIT[3155], INIT[2643], INIT[2131], INIT[1619], INIT[1107], INIT[ 595], INIT[ 83], + INIT[3666], INIT[3154], INIT[2642], INIT[2130], INIT[1618], INIT[1106], INIT[ 594], INIT[ 82], + INIT[3665], INIT[3153], INIT[2641], INIT[2129], INIT[1617], INIT[1105], INIT[ 593], INIT[ 81], + INIT[3664], INIT[3152], INIT[2640], INIT[2128], INIT[1616], INIT[1104], INIT[ 592], INIT[ 80], + INIT[3663], INIT[3151], INIT[2639], INIT[2127], INIT[1615], INIT[1103], INIT[ 591], INIT[ 79], + INIT[3662], INIT[3150], INIT[2638], INIT[2126], INIT[1614], INIT[1102], INIT[ 590], INIT[ 78], + INIT[3661], INIT[3149], INIT[2637], INIT[2125], INIT[1613], INIT[1101], INIT[ 589], INIT[ 77], + INIT[3660], INIT[3148], INIT[2636], INIT[2124], INIT[1612], INIT[1100], INIT[ 588], INIT[ 76], + INIT[3659], INIT[3147], INIT[2635], INIT[2123], INIT[1611], INIT[1099], INIT[ 587], INIT[ 75], + INIT[3658], INIT[3146], INIT[2634], INIT[2122], INIT[1610], INIT[1098], INIT[ 586], INIT[ 74], + INIT[3657], INIT[3145], INIT[2633], INIT[2121], INIT[1609], INIT[1097], INIT[ 585], INIT[ 73], + INIT[3656], INIT[3144], INIT[2632], INIT[2120], INIT[1608], INIT[1096], INIT[ 584], INIT[ 72], + INIT[3655], INIT[3143], INIT[2631], INIT[2119], INIT[1607], INIT[1095], INIT[ 583], INIT[ 71], + INIT[3654], INIT[3142], INIT[2630], INIT[2118], INIT[1606], INIT[1094], INIT[ 582], INIT[ 70], + INIT[3653], INIT[3141], INIT[2629], INIT[2117], INIT[1605], INIT[1093], INIT[ 581], INIT[ 69], + INIT[3652], INIT[3140], INIT[2628], INIT[2116], INIT[1604], INIT[1092], INIT[ 580], INIT[ 68], + INIT[3651], INIT[3139], INIT[2627], INIT[2115], INIT[1603], INIT[1091], INIT[ 579], INIT[ 67], + INIT[3650], INIT[3138], INIT[2626], INIT[2114], INIT[1602], INIT[1090], INIT[ 578], INIT[ 66], + INIT[3649], INIT[3137], INIT[2625], INIT[2113], INIT[1601], INIT[1089], INIT[ 577], INIT[ 65], + INIT[3648], INIT[3136], INIT[2624], INIT[2112], INIT[1600], INIT[1088], INIT[ 576], INIT[ 64] +}; +localparam [255:0] INIT_3 = { + INIT[3711], INIT[3199], INIT[2687], INIT[2175], INIT[1663], INIT[1151], INIT[ 639], INIT[ 127], + INIT[3710], INIT[3198], INIT[2686], INIT[2174], INIT[1662], INIT[1150], INIT[ 638], INIT[ 126], + INIT[3709], INIT[3197], INIT[2685], INIT[2173], INIT[1661], INIT[1149], INIT[ 637], INIT[ 125], + INIT[3708], INIT[3196], INIT[2684], INIT[2172], INIT[1660], INIT[1148], INIT[ 636], INIT[ 124], + INIT[3707], INIT[3195], INIT[2683], INIT[2171], INIT[1659], INIT[1147], INIT[ 635], INIT[ 123], + INIT[3706], INIT[3194], INIT[2682], INIT[2170], INIT[1658], INIT[1146], INIT[ 634], INIT[ 122], + INIT[3705], INIT[3193], INIT[2681], INIT[2169], INIT[1657], INIT[1145], INIT[ 633], INIT[ 121], + INIT[3704], INIT[3192], INIT[2680], INIT[2168], INIT[1656], INIT[1144], INIT[ 632], INIT[ 120], + INIT[3703], INIT[3191], INIT[2679], INIT[2167], INIT[1655], INIT[1143], INIT[ 631], INIT[ 119], + INIT[3702], INIT[3190], INIT[2678], INIT[2166], INIT[1654], INIT[1142], INIT[ 630], INIT[ 118], + INIT[3701], INIT[3189], INIT[2677], INIT[2165], INIT[1653], INIT[1141], INIT[ 629], INIT[ 117], + INIT[3700], INIT[3188], INIT[2676], INIT[2164], INIT[1652], INIT[1140], INIT[ 628], INIT[ 116], + INIT[3699], INIT[3187], INIT[2675], INIT[2163], INIT[1651], INIT[1139], INIT[ 627], INIT[ 115], + INIT[3698], INIT[3186], INIT[2674], INIT[2162], INIT[1650], INIT[1138], INIT[ 626], INIT[ 114], + INIT[3697], INIT[3185], INIT[2673], INIT[2161], INIT[1649], INIT[1137], INIT[ 625], INIT[ 113], + INIT[3696], INIT[3184], INIT[2672], INIT[2160], INIT[1648], INIT[1136], INIT[ 624], INIT[ 112], + INIT[3695], INIT[3183], INIT[2671], INIT[2159], INIT[1647], INIT[1135], INIT[ 623], INIT[ 111], + INIT[3694], INIT[3182], INIT[2670], INIT[2158], INIT[1646], INIT[1134], INIT[ 622], INIT[ 110], + INIT[3693], INIT[3181], INIT[2669], INIT[2157], INIT[1645], INIT[1133], INIT[ 621], INIT[ 109], + INIT[3692], INIT[3180], INIT[2668], INIT[2156], INIT[1644], INIT[1132], INIT[ 620], INIT[ 108], + INIT[3691], INIT[3179], INIT[2667], INIT[2155], INIT[1643], INIT[1131], INIT[ 619], INIT[ 107], + INIT[3690], INIT[3178], INIT[2666], INIT[2154], INIT[1642], INIT[1130], INIT[ 618], INIT[ 106], + INIT[3689], INIT[3177], INIT[2665], INIT[2153], INIT[1641], INIT[1129], INIT[ 617], INIT[ 105], + INIT[3688], INIT[3176], INIT[2664], INIT[2152], INIT[1640], INIT[1128], INIT[ 616], INIT[ 104], + INIT[3687], INIT[3175], INIT[2663], INIT[2151], INIT[1639], INIT[1127], INIT[ 615], INIT[ 103], + INIT[3686], INIT[3174], INIT[2662], INIT[2150], INIT[1638], INIT[1126], INIT[ 614], INIT[ 102], + INIT[3685], INIT[3173], INIT[2661], INIT[2149], INIT[1637], INIT[1125], INIT[ 613], INIT[ 101], + INIT[3684], INIT[3172], INIT[2660], INIT[2148], INIT[1636], INIT[1124], INIT[ 612], INIT[ 100], + INIT[3683], INIT[3171], INIT[2659], INIT[2147], INIT[1635], INIT[1123], INIT[ 611], INIT[ 99], + INIT[3682], INIT[3170], INIT[2658], INIT[2146], INIT[1634], INIT[1122], INIT[ 610], INIT[ 98], + INIT[3681], INIT[3169], INIT[2657], INIT[2145], INIT[1633], INIT[1121], INIT[ 609], INIT[ 97], + INIT[3680], INIT[3168], INIT[2656], INIT[2144], INIT[1632], INIT[1120], INIT[ 608], INIT[ 96] +}; +localparam [255:0] INIT_4 = { + INIT[3743], INIT[3231], INIT[2719], INIT[2207], INIT[1695], INIT[1183], INIT[ 671], INIT[ 159], + INIT[3742], INIT[3230], INIT[2718], INIT[2206], INIT[1694], INIT[1182], INIT[ 670], INIT[ 158], + INIT[3741], INIT[3229], INIT[2717], INIT[2205], INIT[1693], INIT[1181], INIT[ 669], INIT[ 157], + INIT[3740], INIT[3228], INIT[2716], INIT[2204], INIT[1692], INIT[1180], INIT[ 668], INIT[ 156], + INIT[3739], INIT[3227], INIT[2715], INIT[2203], INIT[1691], INIT[1179], INIT[ 667], INIT[ 155], + INIT[3738], INIT[3226], INIT[2714], INIT[2202], INIT[1690], INIT[1178], INIT[ 666], INIT[ 154], + INIT[3737], INIT[3225], INIT[2713], INIT[2201], INIT[1689], INIT[1177], INIT[ 665], INIT[ 153], + INIT[3736], INIT[3224], INIT[2712], INIT[2200], INIT[1688], INIT[1176], INIT[ 664], INIT[ 152], + INIT[3735], INIT[3223], INIT[2711], INIT[2199], INIT[1687], INIT[1175], INIT[ 663], INIT[ 151], + INIT[3734], INIT[3222], INIT[2710], INIT[2198], INIT[1686], INIT[1174], INIT[ 662], INIT[ 150], + INIT[3733], INIT[3221], INIT[2709], INIT[2197], INIT[1685], INIT[1173], INIT[ 661], INIT[ 149], + INIT[3732], INIT[3220], INIT[2708], INIT[2196], INIT[1684], INIT[1172], INIT[ 660], INIT[ 148], + INIT[3731], INIT[3219], INIT[2707], INIT[2195], INIT[1683], INIT[1171], INIT[ 659], INIT[ 147], + INIT[3730], INIT[3218], INIT[2706], INIT[2194], INIT[1682], INIT[1170], INIT[ 658], INIT[ 146], + INIT[3729], INIT[3217], INIT[2705], INIT[2193], INIT[1681], INIT[1169], INIT[ 657], INIT[ 145], + INIT[3728], INIT[3216], INIT[2704], INIT[2192], INIT[1680], INIT[1168], INIT[ 656], INIT[ 144], + INIT[3727], INIT[3215], INIT[2703], INIT[2191], INIT[1679], INIT[1167], INIT[ 655], INIT[ 143], + INIT[3726], INIT[3214], INIT[2702], INIT[2190], INIT[1678], INIT[1166], INIT[ 654], INIT[ 142], + INIT[3725], INIT[3213], INIT[2701], INIT[2189], INIT[1677], INIT[1165], INIT[ 653], INIT[ 141], + INIT[3724], INIT[3212], INIT[2700], INIT[2188], INIT[1676], INIT[1164], INIT[ 652], INIT[ 140], + INIT[3723], INIT[3211], INIT[2699], INIT[2187], INIT[1675], INIT[1163], INIT[ 651], INIT[ 139], + INIT[3722], INIT[3210], INIT[2698], INIT[2186], INIT[1674], INIT[1162], INIT[ 650], INIT[ 138], + INIT[3721], INIT[3209], INIT[2697], INIT[2185], INIT[1673], INIT[1161], INIT[ 649], INIT[ 137], + INIT[3720], INIT[3208], INIT[2696], INIT[2184], INIT[1672], INIT[1160], INIT[ 648], INIT[ 136], + INIT[3719], INIT[3207], INIT[2695], INIT[2183], INIT[1671], INIT[1159], INIT[ 647], INIT[ 135], + INIT[3718], INIT[3206], INIT[2694], INIT[2182], INIT[1670], INIT[1158], INIT[ 646], INIT[ 134], + INIT[3717], INIT[3205], INIT[2693], INIT[2181], INIT[1669], INIT[1157], INIT[ 645], INIT[ 133], + INIT[3716], INIT[3204], INIT[2692], INIT[2180], INIT[1668], INIT[1156], INIT[ 644], INIT[ 132], + INIT[3715], INIT[3203], INIT[2691], INIT[2179], INIT[1667], INIT[1155], INIT[ 643], INIT[ 131], + INIT[3714], INIT[3202], INIT[2690], INIT[2178], INIT[1666], INIT[1154], INIT[ 642], INIT[ 130], + INIT[3713], INIT[3201], INIT[2689], INIT[2177], INIT[1665], INIT[1153], INIT[ 641], INIT[ 129], + INIT[3712], INIT[3200], INIT[2688], INIT[2176], INIT[1664], INIT[1152], INIT[ 640], INIT[ 128] +}; +localparam [255:0] INIT_5 = { + INIT[3775], INIT[3263], INIT[2751], INIT[2239], INIT[1727], INIT[1215], INIT[ 703], INIT[ 191], + INIT[3774], INIT[3262], INIT[2750], INIT[2238], INIT[1726], INIT[1214], INIT[ 702], INIT[ 190], + INIT[3773], INIT[3261], INIT[2749], INIT[2237], INIT[1725], INIT[1213], INIT[ 701], INIT[ 189], + INIT[3772], INIT[3260], INIT[2748], INIT[2236], INIT[1724], INIT[1212], INIT[ 700], INIT[ 188], + INIT[3771], INIT[3259], INIT[2747], INIT[2235], INIT[1723], INIT[1211], INIT[ 699], INIT[ 187], + INIT[3770], INIT[3258], INIT[2746], INIT[2234], INIT[1722], INIT[1210], INIT[ 698], INIT[ 186], + INIT[3769], INIT[3257], INIT[2745], INIT[2233], INIT[1721], INIT[1209], INIT[ 697], INIT[ 185], + INIT[3768], INIT[3256], INIT[2744], INIT[2232], INIT[1720], INIT[1208], INIT[ 696], INIT[ 184], + INIT[3767], INIT[3255], INIT[2743], INIT[2231], INIT[1719], INIT[1207], INIT[ 695], INIT[ 183], + INIT[3766], INIT[3254], INIT[2742], INIT[2230], INIT[1718], INIT[1206], INIT[ 694], INIT[ 182], + INIT[3765], INIT[3253], INIT[2741], INIT[2229], INIT[1717], INIT[1205], INIT[ 693], INIT[ 181], + INIT[3764], INIT[3252], INIT[2740], INIT[2228], INIT[1716], INIT[1204], INIT[ 692], INIT[ 180], + INIT[3763], INIT[3251], INIT[2739], INIT[2227], INIT[1715], INIT[1203], INIT[ 691], INIT[ 179], + INIT[3762], INIT[3250], INIT[2738], INIT[2226], INIT[1714], INIT[1202], INIT[ 690], INIT[ 178], + INIT[3761], INIT[3249], INIT[2737], INIT[2225], INIT[1713], INIT[1201], INIT[ 689], INIT[ 177], + INIT[3760], INIT[3248], INIT[2736], INIT[2224], INIT[1712], INIT[1200], INIT[ 688], INIT[ 176], + INIT[3759], INIT[3247], INIT[2735], INIT[2223], INIT[1711], INIT[1199], INIT[ 687], INIT[ 175], + INIT[3758], INIT[3246], INIT[2734], INIT[2222], INIT[1710], INIT[1198], INIT[ 686], INIT[ 174], + INIT[3757], INIT[3245], INIT[2733], INIT[2221], INIT[1709], INIT[1197], INIT[ 685], INIT[ 173], + INIT[3756], INIT[3244], INIT[2732], INIT[2220], INIT[1708], INIT[1196], INIT[ 684], INIT[ 172], + INIT[3755], INIT[3243], INIT[2731], INIT[2219], INIT[1707], INIT[1195], INIT[ 683], INIT[ 171], + INIT[3754], INIT[3242], INIT[2730], INIT[2218], INIT[1706], INIT[1194], INIT[ 682], INIT[ 170], + INIT[3753], INIT[3241], INIT[2729], INIT[2217], INIT[1705], INIT[1193], INIT[ 681], INIT[ 169], + INIT[3752], INIT[3240], INIT[2728], INIT[2216], INIT[1704], INIT[1192], INIT[ 680], INIT[ 168], + INIT[3751], INIT[3239], INIT[2727], INIT[2215], INIT[1703], INIT[1191], INIT[ 679], INIT[ 167], + INIT[3750], INIT[3238], INIT[2726], INIT[2214], INIT[1702], INIT[1190], INIT[ 678], INIT[ 166], + INIT[3749], INIT[3237], INIT[2725], INIT[2213], INIT[1701], INIT[1189], INIT[ 677], INIT[ 165], + INIT[3748], INIT[3236], INIT[2724], INIT[2212], INIT[1700], INIT[1188], INIT[ 676], INIT[ 164], + INIT[3747], INIT[3235], INIT[2723], INIT[2211], INIT[1699], INIT[1187], INIT[ 675], INIT[ 163], + INIT[3746], INIT[3234], INIT[2722], INIT[2210], INIT[1698], INIT[1186], INIT[ 674], INIT[ 162], + INIT[3745], INIT[3233], INIT[2721], INIT[2209], INIT[1697], INIT[1185], INIT[ 673], INIT[ 161], + INIT[3744], INIT[3232], INIT[2720], INIT[2208], INIT[1696], INIT[1184], INIT[ 672], INIT[ 160] +}; +localparam [255:0] INIT_6 = { + INIT[3807], INIT[3295], INIT[2783], INIT[2271], INIT[1759], INIT[1247], INIT[ 735], INIT[ 223], + INIT[3806], INIT[3294], INIT[2782], INIT[2270], INIT[1758], INIT[1246], INIT[ 734], INIT[ 222], + INIT[3805], INIT[3293], INIT[2781], INIT[2269], INIT[1757], INIT[1245], INIT[ 733], INIT[ 221], + INIT[3804], INIT[3292], INIT[2780], INIT[2268], INIT[1756], INIT[1244], INIT[ 732], INIT[ 220], + INIT[3803], INIT[3291], INIT[2779], INIT[2267], INIT[1755], INIT[1243], INIT[ 731], INIT[ 219], + INIT[3802], INIT[3290], INIT[2778], INIT[2266], INIT[1754], INIT[1242], INIT[ 730], INIT[ 218], + INIT[3801], INIT[3289], INIT[2777], INIT[2265], INIT[1753], INIT[1241], INIT[ 729], INIT[ 217], + INIT[3800], INIT[3288], INIT[2776], INIT[2264], INIT[1752], INIT[1240], INIT[ 728], INIT[ 216], + INIT[3799], INIT[3287], INIT[2775], INIT[2263], INIT[1751], INIT[1239], INIT[ 727], INIT[ 215], + INIT[3798], INIT[3286], INIT[2774], INIT[2262], INIT[1750], INIT[1238], INIT[ 726], INIT[ 214], + INIT[3797], INIT[3285], INIT[2773], INIT[2261], INIT[1749], INIT[1237], INIT[ 725], INIT[ 213], + INIT[3796], INIT[3284], INIT[2772], INIT[2260], INIT[1748], INIT[1236], INIT[ 724], INIT[ 212], + INIT[3795], INIT[3283], INIT[2771], INIT[2259], INIT[1747], INIT[1235], INIT[ 723], INIT[ 211], + INIT[3794], INIT[3282], INIT[2770], INIT[2258], INIT[1746], INIT[1234], INIT[ 722], INIT[ 210], + INIT[3793], INIT[3281], INIT[2769], INIT[2257], INIT[1745], INIT[1233], INIT[ 721], INIT[ 209], + INIT[3792], INIT[3280], INIT[2768], INIT[2256], INIT[1744], INIT[1232], INIT[ 720], INIT[ 208], + INIT[3791], INIT[3279], INIT[2767], INIT[2255], INIT[1743], INIT[1231], INIT[ 719], INIT[ 207], + INIT[3790], INIT[3278], INIT[2766], INIT[2254], INIT[1742], INIT[1230], INIT[ 718], INIT[ 206], + INIT[3789], INIT[3277], INIT[2765], INIT[2253], INIT[1741], INIT[1229], INIT[ 717], INIT[ 205], + INIT[3788], INIT[3276], INIT[2764], INIT[2252], INIT[1740], INIT[1228], INIT[ 716], INIT[ 204], + INIT[3787], INIT[3275], INIT[2763], INIT[2251], INIT[1739], INIT[1227], INIT[ 715], INIT[ 203], + INIT[3786], INIT[3274], INIT[2762], INIT[2250], INIT[1738], INIT[1226], INIT[ 714], INIT[ 202], + INIT[3785], INIT[3273], INIT[2761], INIT[2249], INIT[1737], INIT[1225], INIT[ 713], INIT[ 201], + INIT[3784], INIT[3272], INIT[2760], INIT[2248], INIT[1736], INIT[1224], INIT[ 712], INIT[ 200], + INIT[3783], INIT[3271], INIT[2759], INIT[2247], INIT[1735], INIT[1223], INIT[ 711], INIT[ 199], + INIT[3782], INIT[3270], INIT[2758], INIT[2246], INIT[1734], INIT[1222], INIT[ 710], INIT[ 198], + INIT[3781], INIT[3269], INIT[2757], INIT[2245], INIT[1733], INIT[1221], INIT[ 709], INIT[ 197], + INIT[3780], INIT[3268], INIT[2756], INIT[2244], INIT[1732], INIT[1220], INIT[ 708], INIT[ 196], + INIT[3779], INIT[3267], INIT[2755], INIT[2243], INIT[1731], INIT[1219], INIT[ 707], INIT[ 195], + INIT[3778], INIT[3266], INIT[2754], INIT[2242], INIT[1730], INIT[1218], INIT[ 706], INIT[ 194], + INIT[3777], INIT[3265], INIT[2753], INIT[2241], INIT[1729], INIT[1217], INIT[ 705], INIT[ 193], + INIT[3776], INIT[3264], INIT[2752], INIT[2240], INIT[1728], INIT[1216], INIT[ 704], INIT[ 192] +}; +localparam [255:0] INIT_7 = { + INIT[3839], INIT[3327], INIT[2815], INIT[2303], INIT[1791], INIT[1279], INIT[ 767], INIT[ 255], + INIT[3838], INIT[3326], INIT[2814], INIT[2302], INIT[1790], INIT[1278], INIT[ 766], INIT[ 254], + INIT[3837], INIT[3325], INIT[2813], INIT[2301], INIT[1789], INIT[1277], INIT[ 765], INIT[ 253], + INIT[3836], INIT[3324], INIT[2812], INIT[2300], INIT[1788], INIT[1276], INIT[ 764], INIT[ 252], + INIT[3835], INIT[3323], INIT[2811], INIT[2299], INIT[1787], INIT[1275], INIT[ 763], INIT[ 251], + INIT[3834], INIT[3322], INIT[2810], INIT[2298], INIT[1786], INIT[1274], INIT[ 762], INIT[ 250], + INIT[3833], INIT[3321], INIT[2809], INIT[2297], INIT[1785], INIT[1273], INIT[ 761], INIT[ 249], + INIT[3832], INIT[3320], INIT[2808], INIT[2296], INIT[1784], INIT[1272], INIT[ 760], INIT[ 248], + INIT[3831], INIT[3319], INIT[2807], INIT[2295], INIT[1783], INIT[1271], INIT[ 759], INIT[ 247], + INIT[3830], INIT[3318], INIT[2806], INIT[2294], INIT[1782], INIT[1270], INIT[ 758], INIT[ 246], + INIT[3829], INIT[3317], INIT[2805], INIT[2293], INIT[1781], INIT[1269], INIT[ 757], INIT[ 245], + INIT[3828], INIT[3316], INIT[2804], INIT[2292], INIT[1780], INIT[1268], INIT[ 756], INIT[ 244], + INIT[3827], INIT[3315], INIT[2803], INIT[2291], INIT[1779], INIT[1267], INIT[ 755], INIT[ 243], + INIT[3826], INIT[3314], INIT[2802], INIT[2290], INIT[1778], INIT[1266], INIT[ 754], INIT[ 242], + INIT[3825], INIT[3313], INIT[2801], INIT[2289], INIT[1777], INIT[1265], INIT[ 753], INIT[ 241], + INIT[3824], INIT[3312], INIT[2800], INIT[2288], INIT[1776], INIT[1264], INIT[ 752], INIT[ 240], + INIT[3823], INIT[3311], INIT[2799], INIT[2287], INIT[1775], INIT[1263], INIT[ 751], INIT[ 239], + INIT[3822], INIT[3310], INIT[2798], INIT[2286], INIT[1774], INIT[1262], INIT[ 750], INIT[ 238], + INIT[3821], INIT[3309], INIT[2797], INIT[2285], INIT[1773], INIT[1261], INIT[ 749], INIT[ 237], + INIT[3820], INIT[3308], INIT[2796], INIT[2284], INIT[1772], INIT[1260], INIT[ 748], INIT[ 236], + INIT[3819], INIT[3307], INIT[2795], INIT[2283], INIT[1771], INIT[1259], INIT[ 747], INIT[ 235], + INIT[3818], INIT[3306], INIT[2794], INIT[2282], INIT[1770], INIT[1258], INIT[ 746], INIT[ 234], + INIT[3817], INIT[3305], INIT[2793], INIT[2281], INIT[1769], INIT[1257], INIT[ 745], INIT[ 233], + INIT[3816], INIT[3304], INIT[2792], INIT[2280], INIT[1768], INIT[1256], INIT[ 744], INIT[ 232], + INIT[3815], INIT[3303], INIT[2791], INIT[2279], INIT[1767], INIT[1255], INIT[ 743], INIT[ 231], + INIT[3814], INIT[3302], INIT[2790], INIT[2278], INIT[1766], INIT[1254], INIT[ 742], INIT[ 230], + INIT[3813], INIT[3301], INIT[2789], INIT[2277], INIT[1765], INIT[1253], INIT[ 741], INIT[ 229], + INIT[3812], INIT[3300], INIT[2788], INIT[2276], INIT[1764], INIT[1252], INIT[ 740], INIT[ 228], + INIT[3811], INIT[3299], INIT[2787], INIT[2275], INIT[1763], INIT[1251], INIT[ 739], INIT[ 227], + INIT[3810], INIT[3298], INIT[2786], INIT[2274], INIT[1762], INIT[1250], INIT[ 738], INIT[ 226], + INIT[3809], INIT[3297], INIT[2785], INIT[2273], INIT[1761], INIT[1249], INIT[ 737], INIT[ 225], + INIT[3808], INIT[3296], INIT[2784], INIT[2272], INIT[1760], INIT[1248], INIT[ 736], INIT[ 224] +}; +localparam [255:0] INIT_8 = { + INIT[3871], INIT[3359], INIT[2847], INIT[2335], INIT[1823], INIT[1311], INIT[ 799], INIT[ 287], + INIT[3870], INIT[3358], INIT[2846], INIT[2334], INIT[1822], INIT[1310], INIT[ 798], INIT[ 286], + INIT[3869], INIT[3357], INIT[2845], INIT[2333], INIT[1821], INIT[1309], INIT[ 797], INIT[ 285], + INIT[3868], INIT[3356], INIT[2844], INIT[2332], INIT[1820], INIT[1308], INIT[ 796], INIT[ 284], + INIT[3867], INIT[3355], INIT[2843], INIT[2331], INIT[1819], INIT[1307], INIT[ 795], INIT[ 283], + INIT[3866], INIT[3354], INIT[2842], INIT[2330], INIT[1818], INIT[1306], INIT[ 794], INIT[ 282], + INIT[3865], INIT[3353], INIT[2841], INIT[2329], INIT[1817], INIT[1305], INIT[ 793], INIT[ 281], + INIT[3864], INIT[3352], INIT[2840], INIT[2328], INIT[1816], INIT[1304], INIT[ 792], INIT[ 280], + INIT[3863], INIT[3351], INIT[2839], INIT[2327], INIT[1815], INIT[1303], INIT[ 791], INIT[ 279], + INIT[3862], INIT[3350], INIT[2838], INIT[2326], INIT[1814], INIT[1302], INIT[ 790], INIT[ 278], + INIT[3861], INIT[3349], INIT[2837], INIT[2325], INIT[1813], INIT[1301], INIT[ 789], INIT[ 277], + INIT[3860], INIT[3348], INIT[2836], INIT[2324], INIT[1812], INIT[1300], INIT[ 788], INIT[ 276], + INIT[3859], INIT[3347], INIT[2835], INIT[2323], INIT[1811], INIT[1299], INIT[ 787], INIT[ 275], + INIT[3858], INIT[3346], INIT[2834], INIT[2322], INIT[1810], INIT[1298], INIT[ 786], INIT[ 274], + INIT[3857], INIT[3345], INIT[2833], INIT[2321], INIT[1809], INIT[1297], INIT[ 785], INIT[ 273], + INIT[3856], INIT[3344], INIT[2832], INIT[2320], INIT[1808], INIT[1296], INIT[ 784], INIT[ 272], + INIT[3855], INIT[3343], INIT[2831], INIT[2319], INIT[1807], INIT[1295], INIT[ 783], INIT[ 271], + INIT[3854], INIT[3342], INIT[2830], INIT[2318], INIT[1806], INIT[1294], INIT[ 782], INIT[ 270], + INIT[3853], INIT[3341], INIT[2829], INIT[2317], INIT[1805], INIT[1293], INIT[ 781], INIT[ 269], + INIT[3852], INIT[3340], INIT[2828], INIT[2316], INIT[1804], INIT[1292], INIT[ 780], INIT[ 268], + INIT[3851], INIT[3339], INIT[2827], INIT[2315], INIT[1803], INIT[1291], INIT[ 779], INIT[ 267], + INIT[3850], INIT[3338], INIT[2826], INIT[2314], INIT[1802], INIT[1290], INIT[ 778], INIT[ 266], + INIT[3849], INIT[3337], INIT[2825], INIT[2313], INIT[1801], INIT[1289], INIT[ 777], INIT[ 265], + INIT[3848], INIT[3336], INIT[2824], INIT[2312], INIT[1800], INIT[1288], INIT[ 776], INIT[ 264], + INIT[3847], INIT[3335], INIT[2823], INIT[2311], INIT[1799], INIT[1287], INIT[ 775], INIT[ 263], + INIT[3846], INIT[3334], INIT[2822], INIT[2310], INIT[1798], INIT[1286], INIT[ 774], INIT[ 262], + INIT[3845], INIT[3333], INIT[2821], INIT[2309], INIT[1797], INIT[1285], INIT[ 773], INIT[ 261], + INIT[3844], INIT[3332], INIT[2820], INIT[2308], INIT[1796], INIT[1284], INIT[ 772], INIT[ 260], + INIT[3843], INIT[3331], INIT[2819], INIT[2307], INIT[1795], INIT[1283], INIT[ 771], INIT[ 259], + INIT[3842], INIT[3330], INIT[2818], INIT[2306], INIT[1794], INIT[1282], INIT[ 770], INIT[ 258], + INIT[3841], INIT[3329], INIT[2817], INIT[2305], INIT[1793], INIT[1281], INIT[ 769], INIT[ 257], + INIT[3840], INIT[3328], INIT[2816], INIT[2304], INIT[1792], INIT[1280], INIT[ 768], INIT[ 256] +}; +localparam [255:0] INIT_9 = { + INIT[3903], INIT[3391], INIT[2879], INIT[2367], INIT[1855], INIT[1343], INIT[ 831], INIT[ 319], + INIT[3902], INIT[3390], INIT[2878], INIT[2366], INIT[1854], INIT[1342], INIT[ 830], INIT[ 318], + INIT[3901], INIT[3389], INIT[2877], INIT[2365], INIT[1853], INIT[1341], INIT[ 829], INIT[ 317], + INIT[3900], INIT[3388], INIT[2876], INIT[2364], INIT[1852], INIT[1340], INIT[ 828], INIT[ 316], + INIT[3899], INIT[3387], INIT[2875], INIT[2363], INIT[1851], INIT[1339], INIT[ 827], INIT[ 315], + INIT[3898], INIT[3386], INIT[2874], INIT[2362], INIT[1850], INIT[1338], INIT[ 826], INIT[ 314], + INIT[3897], INIT[3385], INIT[2873], INIT[2361], INIT[1849], INIT[1337], INIT[ 825], INIT[ 313], + INIT[3896], INIT[3384], INIT[2872], INIT[2360], INIT[1848], INIT[1336], INIT[ 824], INIT[ 312], + INIT[3895], INIT[3383], INIT[2871], INIT[2359], INIT[1847], INIT[1335], INIT[ 823], INIT[ 311], + INIT[3894], INIT[3382], INIT[2870], INIT[2358], INIT[1846], INIT[1334], INIT[ 822], INIT[ 310], + INIT[3893], INIT[3381], INIT[2869], INIT[2357], INIT[1845], INIT[1333], INIT[ 821], INIT[ 309], + INIT[3892], INIT[3380], INIT[2868], INIT[2356], INIT[1844], INIT[1332], INIT[ 820], INIT[ 308], + INIT[3891], INIT[3379], INIT[2867], INIT[2355], INIT[1843], INIT[1331], INIT[ 819], INIT[ 307], + INIT[3890], INIT[3378], INIT[2866], INIT[2354], INIT[1842], INIT[1330], INIT[ 818], INIT[ 306], + INIT[3889], INIT[3377], INIT[2865], INIT[2353], INIT[1841], INIT[1329], INIT[ 817], INIT[ 305], + INIT[3888], INIT[3376], INIT[2864], INIT[2352], INIT[1840], INIT[1328], INIT[ 816], INIT[ 304], + INIT[3887], INIT[3375], INIT[2863], INIT[2351], INIT[1839], INIT[1327], INIT[ 815], INIT[ 303], + INIT[3886], INIT[3374], INIT[2862], INIT[2350], INIT[1838], INIT[1326], INIT[ 814], INIT[ 302], + INIT[3885], INIT[3373], INIT[2861], INIT[2349], INIT[1837], INIT[1325], INIT[ 813], INIT[ 301], + INIT[3884], INIT[3372], INIT[2860], INIT[2348], INIT[1836], INIT[1324], INIT[ 812], INIT[ 300], + INIT[3883], INIT[3371], INIT[2859], INIT[2347], INIT[1835], INIT[1323], INIT[ 811], INIT[ 299], + INIT[3882], INIT[3370], INIT[2858], INIT[2346], INIT[1834], INIT[1322], INIT[ 810], INIT[ 298], + INIT[3881], INIT[3369], INIT[2857], INIT[2345], INIT[1833], INIT[1321], INIT[ 809], INIT[ 297], + INIT[3880], INIT[3368], INIT[2856], INIT[2344], INIT[1832], INIT[1320], INIT[ 808], INIT[ 296], + INIT[3879], INIT[3367], INIT[2855], INIT[2343], INIT[1831], INIT[1319], INIT[ 807], INIT[ 295], + INIT[3878], INIT[3366], INIT[2854], INIT[2342], INIT[1830], INIT[1318], INIT[ 806], INIT[ 294], + INIT[3877], INIT[3365], INIT[2853], INIT[2341], INIT[1829], INIT[1317], INIT[ 805], INIT[ 293], + INIT[3876], INIT[3364], INIT[2852], INIT[2340], INIT[1828], INIT[1316], INIT[ 804], INIT[ 292], + INIT[3875], INIT[3363], INIT[2851], INIT[2339], INIT[1827], INIT[1315], INIT[ 803], INIT[ 291], + INIT[3874], INIT[3362], INIT[2850], INIT[2338], INIT[1826], INIT[1314], INIT[ 802], INIT[ 290], + INIT[3873], INIT[3361], INIT[2849], INIT[2337], INIT[1825], INIT[1313], INIT[ 801], INIT[ 289], + INIT[3872], INIT[3360], INIT[2848], INIT[2336], INIT[1824], INIT[1312], INIT[ 800], INIT[ 288] +}; +localparam [255:0] INIT_A = { + INIT[3935], INIT[3423], INIT[2911], INIT[2399], INIT[1887], INIT[1375], INIT[ 863], INIT[ 351], + INIT[3934], INIT[3422], INIT[2910], INIT[2398], INIT[1886], INIT[1374], INIT[ 862], INIT[ 350], + INIT[3933], INIT[3421], INIT[2909], INIT[2397], INIT[1885], INIT[1373], INIT[ 861], INIT[ 349], + INIT[3932], INIT[3420], INIT[2908], INIT[2396], INIT[1884], INIT[1372], INIT[ 860], INIT[ 348], + INIT[3931], INIT[3419], INIT[2907], INIT[2395], INIT[1883], INIT[1371], INIT[ 859], INIT[ 347], + INIT[3930], INIT[3418], INIT[2906], INIT[2394], INIT[1882], INIT[1370], INIT[ 858], INIT[ 346], + INIT[3929], INIT[3417], INIT[2905], INIT[2393], INIT[1881], INIT[1369], INIT[ 857], INIT[ 345], + INIT[3928], INIT[3416], INIT[2904], INIT[2392], INIT[1880], INIT[1368], INIT[ 856], INIT[ 344], + INIT[3927], INIT[3415], INIT[2903], INIT[2391], INIT[1879], INIT[1367], INIT[ 855], INIT[ 343], + INIT[3926], INIT[3414], INIT[2902], INIT[2390], INIT[1878], INIT[1366], INIT[ 854], INIT[ 342], + INIT[3925], INIT[3413], INIT[2901], INIT[2389], INIT[1877], INIT[1365], INIT[ 853], INIT[ 341], + INIT[3924], INIT[3412], INIT[2900], INIT[2388], INIT[1876], INIT[1364], INIT[ 852], INIT[ 340], + INIT[3923], INIT[3411], INIT[2899], INIT[2387], INIT[1875], INIT[1363], INIT[ 851], INIT[ 339], + INIT[3922], INIT[3410], INIT[2898], INIT[2386], INIT[1874], INIT[1362], INIT[ 850], INIT[ 338], + INIT[3921], INIT[3409], INIT[2897], INIT[2385], INIT[1873], INIT[1361], INIT[ 849], INIT[ 337], + INIT[3920], INIT[3408], INIT[2896], INIT[2384], INIT[1872], INIT[1360], INIT[ 848], INIT[ 336], + INIT[3919], INIT[3407], INIT[2895], INIT[2383], INIT[1871], INIT[1359], INIT[ 847], INIT[ 335], + INIT[3918], INIT[3406], INIT[2894], INIT[2382], INIT[1870], INIT[1358], INIT[ 846], INIT[ 334], + INIT[3917], INIT[3405], INIT[2893], INIT[2381], INIT[1869], INIT[1357], INIT[ 845], INIT[ 333], + INIT[3916], INIT[3404], INIT[2892], INIT[2380], INIT[1868], INIT[1356], INIT[ 844], INIT[ 332], + INIT[3915], INIT[3403], INIT[2891], INIT[2379], INIT[1867], INIT[1355], INIT[ 843], INIT[ 331], + INIT[3914], INIT[3402], INIT[2890], INIT[2378], INIT[1866], INIT[1354], INIT[ 842], INIT[ 330], + INIT[3913], INIT[3401], INIT[2889], INIT[2377], INIT[1865], INIT[1353], INIT[ 841], INIT[ 329], + INIT[3912], INIT[3400], INIT[2888], INIT[2376], INIT[1864], INIT[1352], INIT[ 840], INIT[ 328], + INIT[3911], INIT[3399], INIT[2887], INIT[2375], INIT[1863], INIT[1351], INIT[ 839], INIT[ 327], + INIT[3910], INIT[3398], INIT[2886], INIT[2374], INIT[1862], INIT[1350], INIT[ 838], INIT[ 326], + INIT[3909], INIT[3397], INIT[2885], INIT[2373], INIT[1861], INIT[1349], INIT[ 837], INIT[ 325], + INIT[3908], INIT[3396], INIT[2884], INIT[2372], INIT[1860], INIT[1348], INIT[ 836], INIT[ 324], + INIT[3907], INIT[3395], INIT[2883], INIT[2371], INIT[1859], INIT[1347], INIT[ 835], INIT[ 323], + INIT[3906], INIT[3394], INIT[2882], INIT[2370], INIT[1858], INIT[1346], INIT[ 834], INIT[ 322], + INIT[3905], INIT[3393], INIT[2881], INIT[2369], INIT[1857], INIT[1345], INIT[ 833], INIT[ 321], + INIT[3904], INIT[3392], INIT[2880], INIT[2368], INIT[1856], INIT[1344], INIT[ 832], INIT[ 320] +}; +localparam [255:0] INIT_B = { + INIT[3967], INIT[3455], INIT[2943], INIT[2431], INIT[1919], INIT[1407], INIT[ 895], INIT[ 383], + INIT[3966], INIT[3454], INIT[2942], INIT[2430], INIT[1918], INIT[1406], INIT[ 894], INIT[ 382], + INIT[3965], INIT[3453], INIT[2941], INIT[2429], INIT[1917], INIT[1405], INIT[ 893], INIT[ 381], + INIT[3964], INIT[3452], INIT[2940], INIT[2428], INIT[1916], INIT[1404], INIT[ 892], INIT[ 380], + INIT[3963], INIT[3451], INIT[2939], INIT[2427], INIT[1915], INIT[1403], INIT[ 891], INIT[ 379], + INIT[3962], INIT[3450], INIT[2938], INIT[2426], INIT[1914], INIT[1402], INIT[ 890], INIT[ 378], + INIT[3961], INIT[3449], INIT[2937], INIT[2425], INIT[1913], INIT[1401], INIT[ 889], INIT[ 377], + INIT[3960], INIT[3448], INIT[2936], INIT[2424], INIT[1912], INIT[1400], INIT[ 888], INIT[ 376], + INIT[3959], INIT[3447], INIT[2935], INIT[2423], INIT[1911], INIT[1399], INIT[ 887], INIT[ 375], + INIT[3958], INIT[3446], INIT[2934], INIT[2422], INIT[1910], INIT[1398], INIT[ 886], INIT[ 374], + INIT[3957], INIT[3445], INIT[2933], INIT[2421], INIT[1909], INIT[1397], INIT[ 885], INIT[ 373], + INIT[3956], INIT[3444], INIT[2932], INIT[2420], INIT[1908], INIT[1396], INIT[ 884], INIT[ 372], + INIT[3955], INIT[3443], INIT[2931], INIT[2419], INIT[1907], INIT[1395], INIT[ 883], INIT[ 371], + INIT[3954], INIT[3442], INIT[2930], INIT[2418], INIT[1906], INIT[1394], INIT[ 882], INIT[ 370], + INIT[3953], INIT[3441], INIT[2929], INIT[2417], INIT[1905], INIT[1393], INIT[ 881], INIT[ 369], + INIT[3952], INIT[3440], INIT[2928], INIT[2416], INIT[1904], INIT[1392], INIT[ 880], INIT[ 368], + INIT[3951], INIT[3439], INIT[2927], INIT[2415], INIT[1903], INIT[1391], INIT[ 879], INIT[ 367], + INIT[3950], INIT[3438], INIT[2926], INIT[2414], INIT[1902], INIT[1390], INIT[ 878], INIT[ 366], + INIT[3949], INIT[3437], INIT[2925], INIT[2413], INIT[1901], INIT[1389], INIT[ 877], INIT[ 365], + INIT[3948], INIT[3436], INIT[2924], INIT[2412], INIT[1900], INIT[1388], INIT[ 876], INIT[ 364], + INIT[3947], INIT[3435], INIT[2923], INIT[2411], INIT[1899], INIT[1387], INIT[ 875], INIT[ 363], + INIT[3946], INIT[3434], INIT[2922], INIT[2410], INIT[1898], INIT[1386], INIT[ 874], INIT[ 362], + INIT[3945], INIT[3433], INIT[2921], INIT[2409], INIT[1897], INIT[1385], INIT[ 873], INIT[ 361], + INIT[3944], INIT[3432], INIT[2920], INIT[2408], INIT[1896], INIT[1384], INIT[ 872], INIT[ 360], + INIT[3943], INIT[3431], INIT[2919], INIT[2407], INIT[1895], INIT[1383], INIT[ 871], INIT[ 359], + INIT[3942], INIT[3430], INIT[2918], INIT[2406], INIT[1894], INIT[1382], INIT[ 870], INIT[ 358], + INIT[3941], INIT[3429], INIT[2917], INIT[2405], INIT[1893], INIT[1381], INIT[ 869], INIT[ 357], + INIT[3940], INIT[3428], INIT[2916], INIT[2404], INIT[1892], INIT[1380], INIT[ 868], INIT[ 356], + INIT[3939], INIT[3427], INIT[2915], INIT[2403], INIT[1891], INIT[1379], INIT[ 867], INIT[ 355], + INIT[3938], INIT[3426], INIT[2914], INIT[2402], INIT[1890], INIT[1378], INIT[ 866], INIT[ 354], + INIT[3937], INIT[3425], INIT[2913], INIT[2401], INIT[1889], INIT[1377], INIT[ 865], INIT[ 353], + INIT[3936], INIT[3424], INIT[2912], INIT[2400], INIT[1888], INIT[1376], INIT[ 864], INIT[ 352] +}; +localparam [255:0] INIT_C = { + INIT[3999], INIT[3487], INIT[2975], INIT[2463], INIT[1951], INIT[1439], INIT[ 927], INIT[ 415], + INIT[3998], INIT[3486], INIT[2974], INIT[2462], INIT[1950], INIT[1438], INIT[ 926], INIT[ 414], + INIT[3997], INIT[3485], INIT[2973], INIT[2461], INIT[1949], INIT[1437], INIT[ 925], INIT[ 413], + INIT[3996], INIT[3484], INIT[2972], INIT[2460], INIT[1948], INIT[1436], INIT[ 924], INIT[ 412], + INIT[3995], INIT[3483], INIT[2971], INIT[2459], INIT[1947], INIT[1435], INIT[ 923], INIT[ 411], + INIT[3994], INIT[3482], INIT[2970], INIT[2458], INIT[1946], INIT[1434], INIT[ 922], INIT[ 410], + INIT[3993], INIT[3481], INIT[2969], INIT[2457], INIT[1945], INIT[1433], INIT[ 921], INIT[ 409], + INIT[3992], INIT[3480], INIT[2968], INIT[2456], INIT[1944], INIT[1432], INIT[ 920], INIT[ 408], + INIT[3991], INIT[3479], INIT[2967], INIT[2455], INIT[1943], INIT[1431], INIT[ 919], INIT[ 407], + INIT[3990], INIT[3478], INIT[2966], INIT[2454], INIT[1942], INIT[1430], INIT[ 918], INIT[ 406], + INIT[3989], INIT[3477], INIT[2965], INIT[2453], INIT[1941], INIT[1429], INIT[ 917], INIT[ 405], + INIT[3988], INIT[3476], INIT[2964], INIT[2452], INIT[1940], INIT[1428], INIT[ 916], INIT[ 404], + INIT[3987], INIT[3475], INIT[2963], INIT[2451], INIT[1939], INIT[1427], INIT[ 915], INIT[ 403], + INIT[3986], INIT[3474], INIT[2962], INIT[2450], INIT[1938], INIT[1426], INIT[ 914], INIT[ 402], + INIT[3985], INIT[3473], INIT[2961], INIT[2449], INIT[1937], INIT[1425], INIT[ 913], INIT[ 401], + INIT[3984], INIT[3472], INIT[2960], INIT[2448], INIT[1936], INIT[1424], INIT[ 912], INIT[ 400], + INIT[3983], INIT[3471], INIT[2959], INIT[2447], INIT[1935], INIT[1423], INIT[ 911], INIT[ 399], + INIT[3982], INIT[3470], INIT[2958], INIT[2446], INIT[1934], INIT[1422], INIT[ 910], INIT[ 398], + INIT[3981], INIT[3469], INIT[2957], INIT[2445], INIT[1933], INIT[1421], INIT[ 909], INIT[ 397], + INIT[3980], INIT[3468], INIT[2956], INIT[2444], INIT[1932], INIT[1420], INIT[ 908], INIT[ 396], + INIT[3979], INIT[3467], INIT[2955], INIT[2443], INIT[1931], INIT[1419], INIT[ 907], INIT[ 395], + INIT[3978], INIT[3466], INIT[2954], INIT[2442], INIT[1930], INIT[1418], INIT[ 906], INIT[ 394], + INIT[3977], INIT[3465], INIT[2953], INIT[2441], INIT[1929], INIT[1417], INIT[ 905], INIT[ 393], + INIT[3976], INIT[3464], INIT[2952], INIT[2440], INIT[1928], INIT[1416], INIT[ 904], INIT[ 392], + INIT[3975], INIT[3463], INIT[2951], INIT[2439], INIT[1927], INIT[1415], INIT[ 903], INIT[ 391], + INIT[3974], INIT[3462], INIT[2950], INIT[2438], INIT[1926], INIT[1414], INIT[ 902], INIT[ 390], + INIT[3973], INIT[3461], INIT[2949], INIT[2437], INIT[1925], INIT[1413], INIT[ 901], INIT[ 389], + INIT[3972], INIT[3460], INIT[2948], INIT[2436], INIT[1924], INIT[1412], INIT[ 900], INIT[ 388], + INIT[3971], INIT[3459], INIT[2947], INIT[2435], INIT[1923], INIT[1411], INIT[ 899], INIT[ 387], + INIT[3970], INIT[3458], INIT[2946], INIT[2434], INIT[1922], INIT[1410], INIT[ 898], INIT[ 386], + INIT[3969], INIT[3457], INIT[2945], INIT[2433], INIT[1921], INIT[1409], INIT[ 897], INIT[ 385], + INIT[3968], INIT[3456], INIT[2944], INIT[2432], INIT[1920], INIT[1408], INIT[ 896], INIT[ 384] +}; +localparam [255:0] INIT_D = { + INIT[4031], INIT[3519], INIT[3007], INIT[2495], INIT[1983], INIT[1471], INIT[ 959], INIT[ 447], + INIT[4030], INIT[3518], INIT[3006], INIT[2494], INIT[1982], INIT[1470], INIT[ 958], INIT[ 446], + INIT[4029], INIT[3517], INIT[3005], INIT[2493], INIT[1981], INIT[1469], INIT[ 957], INIT[ 445], + INIT[4028], INIT[3516], INIT[3004], INIT[2492], INIT[1980], INIT[1468], INIT[ 956], INIT[ 444], + INIT[4027], INIT[3515], INIT[3003], INIT[2491], INIT[1979], INIT[1467], INIT[ 955], INIT[ 443], + INIT[4026], INIT[3514], INIT[3002], INIT[2490], INIT[1978], INIT[1466], INIT[ 954], INIT[ 442], + INIT[4025], INIT[3513], INIT[3001], INIT[2489], INIT[1977], INIT[1465], INIT[ 953], INIT[ 441], + INIT[4024], INIT[3512], INIT[3000], INIT[2488], INIT[1976], INIT[1464], INIT[ 952], INIT[ 440], + INIT[4023], INIT[3511], INIT[2999], INIT[2487], INIT[1975], INIT[1463], INIT[ 951], INIT[ 439], + INIT[4022], INIT[3510], INIT[2998], INIT[2486], INIT[1974], INIT[1462], INIT[ 950], INIT[ 438], + INIT[4021], INIT[3509], INIT[2997], INIT[2485], INIT[1973], INIT[1461], INIT[ 949], INIT[ 437], + INIT[4020], INIT[3508], INIT[2996], INIT[2484], INIT[1972], INIT[1460], INIT[ 948], INIT[ 436], + INIT[4019], INIT[3507], INIT[2995], INIT[2483], INIT[1971], INIT[1459], INIT[ 947], INIT[ 435], + INIT[4018], INIT[3506], INIT[2994], INIT[2482], INIT[1970], INIT[1458], INIT[ 946], INIT[ 434], + INIT[4017], INIT[3505], INIT[2993], INIT[2481], INIT[1969], INIT[1457], INIT[ 945], INIT[ 433], + INIT[4016], INIT[3504], INIT[2992], INIT[2480], INIT[1968], INIT[1456], INIT[ 944], INIT[ 432], + INIT[4015], INIT[3503], INIT[2991], INIT[2479], INIT[1967], INIT[1455], INIT[ 943], INIT[ 431], + INIT[4014], INIT[3502], INIT[2990], INIT[2478], INIT[1966], INIT[1454], INIT[ 942], INIT[ 430], + INIT[4013], INIT[3501], INIT[2989], INIT[2477], INIT[1965], INIT[1453], INIT[ 941], INIT[ 429], + INIT[4012], INIT[3500], INIT[2988], INIT[2476], INIT[1964], INIT[1452], INIT[ 940], INIT[ 428], + INIT[4011], INIT[3499], INIT[2987], INIT[2475], INIT[1963], INIT[1451], INIT[ 939], INIT[ 427], + INIT[4010], INIT[3498], INIT[2986], INIT[2474], INIT[1962], INIT[1450], INIT[ 938], INIT[ 426], + INIT[4009], INIT[3497], INIT[2985], INIT[2473], INIT[1961], INIT[1449], INIT[ 937], INIT[ 425], + INIT[4008], INIT[3496], INIT[2984], INIT[2472], INIT[1960], INIT[1448], INIT[ 936], INIT[ 424], + INIT[4007], INIT[3495], INIT[2983], INIT[2471], INIT[1959], INIT[1447], INIT[ 935], INIT[ 423], + INIT[4006], INIT[3494], INIT[2982], INIT[2470], INIT[1958], INIT[1446], INIT[ 934], INIT[ 422], + INIT[4005], INIT[3493], INIT[2981], INIT[2469], INIT[1957], INIT[1445], INIT[ 933], INIT[ 421], + INIT[4004], INIT[3492], INIT[2980], INIT[2468], INIT[1956], INIT[1444], INIT[ 932], INIT[ 420], + INIT[4003], INIT[3491], INIT[2979], INIT[2467], INIT[1955], INIT[1443], INIT[ 931], INIT[ 419], + INIT[4002], INIT[3490], INIT[2978], INIT[2466], INIT[1954], INIT[1442], INIT[ 930], INIT[ 418], + INIT[4001], INIT[3489], INIT[2977], INIT[2465], INIT[1953], INIT[1441], INIT[ 929], INIT[ 417], + INIT[4000], INIT[3488], INIT[2976], INIT[2464], INIT[1952], INIT[1440], INIT[ 928], INIT[ 416] +}; +localparam [255:0] INIT_E = { + INIT[4063], INIT[3551], INIT[3039], INIT[2527], INIT[2015], INIT[1503], INIT[ 991], INIT[ 479], + INIT[4062], INIT[3550], INIT[3038], INIT[2526], INIT[2014], INIT[1502], INIT[ 990], INIT[ 478], + INIT[4061], INIT[3549], INIT[3037], INIT[2525], INIT[2013], INIT[1501], INIT[ 989], INIT[ 477], + INIT[4060], INIT[3548], INIT[3036], INIT[2524], INIT[2012], INIT[1500], INIT[ 988], INIT[ 476], + INIT[4059], INIT[3547], INIT[3035], INIT[2523], INIT[2011], INIT[1499], INIT[ 987], INIT[ 475], + INIT[4058], INIT[3546], INIT[3034], INIT[2522], INIT[2010], INIT[1498], INIT[ 986], INIT[ 474], + INIT[4057], INIT[3545], INIT[3033], INIT[2521], INIT[2009], INIT[1497], INIT[ 985], INIT[ 473], + INIT[4056], INIT[3544], INIT[3032], INIT[2520], INIT[2008], INIT[1496], INIT[ 984], INIT[ 472], + INIT[4055], INIT[3543], INIT[3031], INIT[2519], INIT[2007], INIT[1495], INIT[ 983], INIT[ 471], + INIT[4054], INIT[3542], INIT[3030], INIT[2518], INIT[2006], INIT[1494], INIT[ 982], INIT[ 470], + INIT[4053], INIT[3541], INIT[3029], INIT[2517], INIT[2005], INIT[1493], INIT[ 981], INIT[ 469], + INIT[4052], INIT[3540], INIT[3028], INIT[2516], INIT[2004], INIT[1492], INIT[ 980], INIT[ 468], + INIT[4051], INIT[3539], INIT[3027], INIT[2515], INIT[2003], INIT[1491], INIT[ 979], INIT[ 467], + INIT[4050], INIT[3538], INIT[3026], INIT[2514], INIT[2002], INIT[1490], INIT[ 978], INIT[ 466], + INIT[4049], INIT[3537], INIT[3025], INIT[2513], INIT[2001], INIT[1489], INIT[ 977], INIT[ 465], + INIT[4048], INIT[3536], INIT[3024], INIT[2512], INIT[2000], INIT[1488], INIT[ 976], INIT[ 464], + INIT[4047], INIT[3535], INIT[3023], INIT[2511], INIT[1999], INIT[1487], INIT[ 975], INIT[ 463], + INIT[4046], INIT[3534], INIT[3022], INIT[2510], INIT[1998], INIT[1486], INIT[ 974], INIT[ 462], + INIT[4045], INIT[3533], INIT[3021], INIT[2509], INIT[1997], INIT[1485], INIT[ 973], INIT[ 461], + INIT[4044], INIT[3532], INIT[3020], INIT[2508], INIT[1996], INIT[1484], INIT[ 972], INIT[ 460], + INIT[4043], INIT[3531], INIT[3019], INIT[2507], INIT[1995], INIT[1483], INIT[ 971], INIT[ 459], + INIT[4042], INIT[3530], INIT[3018], INIT[2506], INIT[1994], INIT[1482], INIT[ 970], INIT[ 458], + INIT[4041], INIT[3529], INIT[3017], INIT[2505], INIT[1993], INIT[1481], INIT[ 969], INIT[ 457], + INIT[4040], INIT[3528], INIT[3016], INIT[2504], INIT[1992], INIT[1480], INIT[ 968], INIT[ 456], + INIT[4039], INIT[3527], INIT[3015], INIT[2503], INIT[1991], INIT[1479], INIT[ 967], INIT[ 455], + INIT[4038], INIT[3526], INIT[3014], INIT[2502], INIT[1990], INIT[1478], INIT[ 966], INIT[ 454], + INIT[4037], INIT[3525], INIT[3013], INIT[2501], INIT[1989], INIT[1477], INIT[ 965], INIT[ 453], + INIT[4036], INIT[3524], INIT[3012], INIT[2500], INIT[1988], INIT[1476], INIT[ 964], INIT[ 452], + INIT[4035], INIT[3523], INIT[3011], INIT[2499], INIT[1987], INIT[1475], INIT[ 963], INIT[ 451], + INIT[4034], INIT[3522], INIT[3010], INIT[2498], INIT[1986], INIT[1474], INIT[ 962], INIT[ 450], + INIT[4033], INIT[3521], INIT[3009], INIT[2497], INIT[1985], INIT[1473], INIT[ 961], INIT[ 449], + INIT[4032], INIT[3520], INIT[3008], INIT[2496], INIT[1984], INIT[1472], INIT[ 960], INIT[ 448] +}; +localparam [255:0] INIT_F = { + INIT[4095], INIT[3583], INIT[3071], INIT[2559], INIT[2047], INIT[1535], INIT[1023], INIT[ 511], + INIT[4094], INIT[3582], INIT[3070], INIT[2558], INIT[2046], INIT[1534], INIT[1022], INIT[ 510], + INIT[4093], INIT[3581], INIT[3069], INIT[2557], INIT[2045], INIT[1533], INIT[1021], INIT[ 509], + INIT[4092], INIT[3580], INIT[3068], INIT[2556], INIT[2044], INIT[1532], INIT[1020], INIT[ 508], + INIT[4091], INIT[3579], INIT[3067], INIT[2555], INIT[2043], INIT[1531], INIT[1019], INIT[ 507], + INIT[4090], INIT[3578], INIT[3066], INIT[2554], INIT[2042], INIT[1530], INIT[1018], INIT[ 506], + INIT[4089], INIT[3577], INIT[3065], INIT[2553], INIT[2041], INIT[1529], INIT[1017], INIT[ 505], + INIT[4088], INIT[3576], INIT[3064], INIT[2552], INIT[2040], INIT[1528], INIT[1016], INIT[ 504], + INIT[4087], INIT[3575], INIT[3063], INIT[2551], INIT[2039], INIT[1527], INIT[1015], INIT[ 503], + INIT[4086], INIT[3574], INIT[3062], INIT[2550], INIT[2038], INIT[1526], INIT[1014], INIT[ 502], + INIT[4085], INIT[3573], INIT[3061], INIT[2549], INIT[2037], INIT[1525], INIT[1013], INIT[ 501], + INIT[4084], INIT[3572], INIT[3060], INIT[2548], INIT[2036], INIT[1524], INIT[1012], INIT[ 500], + INIT[4083], INIT[3571], INIT[3059], INIT[2547], INIT[2035], INIT[1523], INIT[1011], INIT[ 499], + INIT[4082], INIT[3570], INIT[3058], INIT[2546], INIT[2034], INIT[1522], INIT[1010], INIT[ 498], + INIT[4081], INIT[3569], INIT[3057], INIT[2545], INIT[2033], INIT[1521], INIT[1009], INIT[ 497], + INIT[4080], INIT[3568], INIT[3056], INIT[2544], INIT[2032], INIT[1520], INIT[1008], INIT[ 496], + INIT[4079], INIT[3567], INIT[3055], INIT[2543], INIT[2031], INIT[1519], INIT[1007], INIT[ 495], + INIT[4078], INIT[3566], INIT[3054], INIT[2542], INIT[2030], INIT[1518], INIT[1006], INIT[ 494], + INIT[4077], INIT[3565], INIT[3053], INIT[2541], INIT[2029], INIT[1517], INIT[1005], INIT[ 493], + INIT[4076], INIT[3564], INIT[3052], INIT[2540], INIT[2028], INIT[1516], INIT[1004], INIT[ 492], + INIT[4075], INIT[3563], INIT[3051], INIT[2539], INIT[2027], INIT[1515], INIT[1003], INIT[ 491], + INIT[4074], INIT[3562], INIT[3050], INIT[2538], INIT[2026], INIT[1514], INIT[1002], INIT[ 490], + INIT[4073], INIT[3561], INIT[3049], INIT[2537], INIT[2025], INIT[1513], INIT[1001], INIT[ 489], + INIT[4072], INIT[3560], INIT[3048], INIT[2536], INIT[2024], INIT[1512], INIT[1000], INIT[ 488], + INIT[4071], INIT[3559], INIT[3047], INIT[2535], INIT[2023], INIT[1511], INIT[ 999], INIT[ 487], + INIT[4070], INIT[3558], INIT[3046], INIT[2534], INIT[2022], INIT[1510], INIT[ 998], INIT[ 486], + INIT[4069], INIT[3557], INIT[3045], INIT[2533], INIT[2021], INIT[1509], INIT[ 997], INIT[ 485], + INIT[4068], INIT[3556], INIT[3044], INIT[2532], INIT[2020], INIT[1508], INIT[ 996], INIT[ 484], + INIT[4067], INIT[3555], INIT[3043], INIT[2531], INIT[2019], INIT[1507], INIT[ 995], INIT[ 483], + INIT[4066], INIT[3554], INIT[3042], INIT[2530], INIT[2018], INIT[1506], INIT[ 994], INIT[ 482], + INIT[4065], INIT[3553], INIT[3041], INIT[2529], INIT[2017], INIT[1505], INIT[ 993], INIT[ 481], + INIT[4064], INIT[3552], INIT[3040], INIT[2528], INIT[2016], INIT[1504], INIT[ 992], INIT[ 480] +}; diff --git a/verilog/windows/autoyosys/share/ice40/brams_map.v b/verilog/windows/autoyosys/share/ice40/brams_map.v new file mode 100644 index 0000000..19a61d7 --- /dev/null +++ b/verilog/windows/autoyosys/share/ice40/brams_map.v @@ -0,0 +1,311 @@ + +module \$__ICE40_RAM4K ( + output [15:0] RDATA, + input RCLK, RCLKE, RE, + input [10:0] RADDR, + input WCLK, WCLKE, WE, + input [10:0] WADDR, + input [15:0] MASK, WDATA +); + parameter integer READ_MODE = 0; + parameter integer WRITE_MODE = 0; + parameter [0:0] NEGCLK_R = 0; + parameter [0:0] NEGCLK_W = 0; + + parameter [255:0] INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter [255:0] INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + + generate + case ({NEGCLK_R, NEGCLK_W}) + 2'b00: + SB_RAM40_4K #( + .READ_MODE(READ_MODE), + .WRITE_MODE(WRITE_MODE), + .INIT_0(INIT_0), + .INIT_1(INIT_1), + .INIT_2(INIT_2), + .INIT_3(INIT_3), + .INIT_4(INIT_4), + .INIT_5(INIT_5), + .INIT_6(INIT_6), + .INIT_7(INIT_7), + .INIT_8(INIT_8), + .INIT_9(INIT_9), + .INIT_A(INIT_A), + .INIT_B(INIT_B), + .INIT_C(INIT_C), + .INIT_D(INIT_D), + .INIT_E(INIT_E), + .INIT_F(INIT_F) + ) _TECHMAP_REPLACE_ ( + .RDATA(RDATA), + .RCLK (RCLK ), + .RCLKE(RCLKE), + .RE (RE ), + .RADDR(RADDR), + .WCLK (WCLK ), + .WCLKE(WCLKE), + .WE (WE ), + .WADDR(WADDR), + .MASK (MASK ), + .WDATA(WDATA) + ); + 2'b01: + SB_RAM40_4KNW #( + .READ_MODE(READ_MODE), + .WRITE_MODE(WRITE_MODE), + .INIT_0(INIT_0), + .INIT_1(INIT_1), + .INIT_2(INIT_2), + .INIT_3(INIT_3), + .INIT_4(INIT_4), + .INIT_5(INIT_5), + .INIT_6(INIT_6), + .INIT_7(INIT_7), + .INIT_8(INIT_8), + .INIT_9(INIT_9), + .INIT_A(INIT_A), + .INIT_B(INIT_B), + .INIT_C(INIT_C), + .INIT_D(INIT_D), + .INIT_E(INIT_E), + .INIT_F(INIT_F) + ) _TECHMAP_REPLACE_ ( + .RDATA(RDATA), + .RCLK (RCLK ), + .RCLKE(RCLKE), + .RE (RE ), + .RADDR(RADDR), + .WCLKN(WCLK ), + .WCLKE(WCLKE), + .WE (WE ), + .WADDR(WADDR), + .MASK (MASK ), + .WDATA(WDATA) + ); + 2'b10: + SB_RAM40_4KNR #( + .READ_MODE(READ_MODE), + .WRITE_MODE(WRITE_MODE), + .INIT_0(INIT_0), + .INIT_1(INIT_1), + .INIT_2(INIT_2), + .INIT_3(INIT_3), + .INIT_4(INIT_4), + .INIT_5(INIT_5), + .INIT_6(INIT_6), + .INIT_7(INIT_7), + .INIT_8(INIT_8), + .INIT_9(INIT_9), + .INIT_A(INIT_A), + .INIT_B(INIT_B), + .INIT_C(INIT_C), + .INIT_D(INIT_D), + .INIT_E(INIT_E), + .INIT_F(INIT_F) + ) _TECHMAP_REPLACE_ ( + .RDATA(RDATA), + .RCLKN(RCLK ), + .RCLKE(RCLKE), + .RE (RE ), + .RADDR(RADDR), + .WCLK (WCLK ), + .WCLKE(WCLKE), + .WE (WE ), + .WADDR(WADDR), + .MASK (MASK ), + .WDATA(WDATA) + ); + 2'b11: + SB_RAM40_4KNRNW #( + .READ_MODE(READ_MODE), + .WRITE_MODE(WRITE_MODE), + .INIT_0(INIT_0), + .INIT_1(INIT_1), + .INIT_2(INIT_2), + .INIT_3(INIT_3), + .INIT_4(INIT_4), + .INIT_5(INIT_5), + .INIT_6(INIT_6), + .INIT_7(INIT_7), + .INIT_8(INIT_8), + .INIT_9(INIT_9), + .INIT_A(INIT_A), + .INIT_B(INIT_B), + .INIT_C(INIT_C), + .INIT_D(INIT_D), + .INIT_E(INIT_E), + .INIT_F(INIT_F) + ) _TECHMAP_REPLACE_ ( + .RDATA(RDATA), + .RCLKN(RCLK ), + .RCLKE(RCLKE), + .RE (RE ), + .RADDR(RADDR), + .WCLKN(WCLK ), + .WCLKE(WCLKE), + .WE (WE ), + .WADDR(WADDR), + .MASK (MASK ), + .WDATA(WDATA) + ); + endcase + endgenerate +endmodule + + +module \$__ICE40_RAM4K_M0 (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); + parameter [0:0] CLKPOL2 = 1; + parameter [0:0] CLKPOL3 = 1; + + parameter [4095:0] INIT = 4096'bx; + + input CLK2; + input CLK3; + + input [7:0] A1ADDR; + output [15:0] A1DATA; + input A1EN; + + input [7:0] B1ADDR; + input [15:0] B1DATA; + input [15:0] B1EN; + + wire [10:0] A1ADDR_11 = A1ADDR; + wire [10:0] B1ADDR_11 = B1ADDR; + + \$__ICE40_RAM4K #( + .READ_MODE(0), + .WRITE_MODE(0), + .NEGCLK_R(!CLKPOL2), + .NEGCLK_W(!CLKPOL3), + .INIT_0(INIT[ 0*256 +: 256]), + .INIT_1(INIT[ 1*256 +: 256]), + .INIT_2(INIT[ 2*256 +: 256]), + .INIT_3(INIT[ 3*256 +: 256]), + .INIT_4(INIT[ 4*256 +: 256]), + .INIT_5(INIT[ 5*256 +: 256]), + .INIT_6(INIT[ 6*256 +: 256]), + .INIT_7(INIT[ 7*256 +: 256]), + .INIT_8(INIT[ 8*256 +: 256]), + .INIT_9(INIT[ 9*256 +: 256]), + .INIT_A(INIT[10*256 +: 256]), + .INIT_B(INIT[11*256 +: 256]), + .INIT_C(INIT[12*256 +: 256]), + .INIT_D(INIT[13*256 +: 256]), + .INIT_E(INIT[14*256 +: 256]), + .INIT_F(INIT[15*256 +: 256]) + ) _TECHMAP_REPLACE_ ( + .RDATA(A1DATA), + .RADDR(A1ADDR_11), + .RCLK(CLK2), + .RCLKE(A1EN), + .RE(1'b1), + .WDATA(B1DATA), + .WADDR(B1ADDR_11), + .MASK(~B1EN), + .WCLK(CLK3), + .WCLKE(|B1EN), + .WE(1'b1) + ); +endmodule + +module \$__ICE40_RAM4K_M123 (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); + parameter CFG_ABITS = 9; + parameter CFG_DBITS = 8; + + parameter [0:0] CLKPOL2 = 1; + parameter [0:0] CLKPOL3 = 1; + + parameter [4095:0] INIT = 4096'bx; + + localparam MODE = + CFG_ABITS == 9 ? 1 : + CFG_ABITS == 10 ? 2 : + CFG_ABITS == 11 ? 3 : 'bx; + + input CLK2; + input CLK3; + + input [CFG_ABITS-1:0] A1ADDR; + output [CFG_DBITS-1:0] A1DATA; + input A1EN; + + input [CFG_ABITS-1:0] B1ADDR; + input [CFG_DBITS-1:0] B1DATA; + input B1EN; + + wire [10:0] A1ADDR_11 = A1ADDR; + wire [10:0] B1ADDR_11 = B1ADDR; + + wire [15:0] A1DATA_16, B1DATA_16; + + generate + if (MODE == 1) begin + assign A1DATA = {A1DATA_16[14], A1DATA_16[12], A1DATA_16[10], A1DATA_16[ 8], + A1DATA_16[ 6], A1DATA_16[ 4], A1DATA_16[ 2], A1DATA_16[ 0]}; + assign {B1DATA_16[14], B1DATA_16[12], B1DATA_16[10], B1DATA_16[ 8], + B1DATA_16[ 6], B1DATA_16[ 4], B1DATA_16[ 2], B1DATA_16[ 0]} = B1DATA; + `include "brams_init1.vh" + end + if (MODE == 2) begin + assign A1DATA = {A1DATA_16[13], A1DATA_16[9], A1DATA_16[5], A1DATA_16[1]}; + assign {B1DATA_16[13], B1DATA_16[9], B1DATA_16[5], B1DATA_16[1]} = B1DATA; + `include "brams_init2.vh" + end + if (MODE == 3) begin + assign A1DATA = {A1DATA_16[11], A1DATA_16[3]}; + assign {B1DATA_16[11], B1DATA_16[3]} = B1DATA; + `include "brams_init3.vh" + end + endgenerate + + \$__ICE40_RAM4K #( + .READ_MODE(MODE), + .WRITE_MODE(MODE), + .NEGCLK_R(!CLKPOL2), + .NEGCLK_W(!CLKPOL3), + .INIT_0(INIT_0), + .INIT_1(INIT_1), + .INIT_2(INIT_2), + .INIT_3(INIT_3), + .INIT_4(INIT_4), + .INIT_5(INIT_5), + .INIT_6(INIT_6), + .INIT_7(INIT_7), + .INIT_8(INIT_8), + .INIT_9(INIT_9), + .INIT_A(INIT_A), + .INIT_B(INIT_B), + .INIT_C(INIT_C), + .INIT_D(INIT_D), + .INIT_E(INIT_E), + .INIT_F(INIT_F) + ) _TECHMAP_REPLACE_ ( + .RDATA(A1DATA_16), + .RADDR(A1ADDR_11), + .RCLK(CLK2), + .RCLKE(A1EN), + .RE(1'b1), + .WDATA(B1DATA_16), + .WADDR(B1ADDR_11), + .WCLK(CLK3), + .WCLKE(|B1EN), + .WE(1'b1) + ); +endmodule + diff --git a/verilog/windows/autoyosys/share/ice40/cells_map.v b/verilog/windows/autoyosys/share/ice40/cells_map.v new file mode 100644 index 0000000..0227ffa --- /dev/null +++ b/verilog/windows/autoyosys/share/ice40/cells_map.v @@ -0,0 +1,57 @@ +module \$_DFF_N_ (input D, C, output Q); SB_DFFN _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C)); endmodule +module \$_DFF_P_ (input D, C, output Q); SB_DFF _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C)); endmodule + +module \$_DFFE_NN_ (input D, C, E, output Q); SB_DFFNE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(!E)); endmodule +module \$_DFFE_PN_ (input D, C, E, output Q); SB_DFFE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(!E)); endmodule + +module \$_DFFE_NP_ (input D, C, E, output Q); SB_DFFNE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E)); endmodule +module \$_DFFE_PP_ (input D, C, E, output Q); SB_DFFE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E)); endmodule + +module \$_DFF_NN0_ (input D, C, R, output Q); SB_DFFNR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(!R)); endmodule +module \$_DFF_NN1_ (input D, C, R, output Q); SB_DFFNS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .S(!R)); endmodule +module \$_DFF_PN0_ (input D, C, R, output Q); SB_DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(!R)); endmodule +module \$_DFF_PN1_ (input D, C, R, output Q); SB_DFFS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .S(!R)); endmodule + +module \$_DFF_NP0_ (input D, C, R, output Q); SB_DFFNR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(R)); endmodule +module \$_DFF_NP1_ (input D, C, R, output Q); SB_DFFNS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .S(R)); endmodule +module \$_DFF_PP0_ (input D, C, R, output Q); SB_DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(R)); endmodule +module \$_DFF_PP1_ (input D, C, R, output Q); SB_DFFS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .S(R)); endmodule + +module \$__DFFE_NN0 (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule +module \$__DFFE_NN1 (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule +module \$__DFFE_PN0 (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule +module \$__DFFE_PN1 (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule + +module \$__DFFE_NP0 (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule +module \$__DFFE_NP1 (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule +module \$__DFFE_PP0 (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule +module \$__DFFE_PP1 (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule + +module \$lut (A, Y); + parameter WIDTH = 0; + parameter LUT = 0; + + input [WIDTH-1:0] A; + output Y; + + generate + if (WIDTH == 1) begin + SB_LUT4 #(.LUT_INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0]), .I1(1'b0), .I2(1'b0), .I3(1'b0)); + end else + if (WIDTH == 2) begin + SB_LUT4 #(.LUT_INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0]), .I1(A[1]), .I2(1'b0), .I3(1'b0)); + end else + if (WIDTH == 3) begin + SB_LUT4 #(.LUT_INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0]), .I1(A[1]), .I2(A[2]), .I3(1'b0)); + end else + if (WIDTH == 4) begin + SB_LUT4 #(.LUT_INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0]), .I1(A[1]), .I2(A[2]), .I3(A[3])); + end else begin + wire _TECHMAP_FAIL_ = 1; + end + endgenerate +endmodule diff --git a/verilog/windows/autoyosys/share/ice40/cells_sim.v b/verilog/windows/autoyosys/share/ice40/cells_sim.v new file mode 100644 index 0000000..7778b55 --- /dev/null +++ b/verilog/windows/autoyosys/share/ice40/cells_sim.v @@ -0,0 +1,883 @@ + +`define SB_DFF_REG reg Q = 0; +// `define SB_DFF_REG reg Q; + +// SiliconBlue IO Cells + +module SB_IO ( + inout PACKAGE_PIN, + input LATCH_INPUT_VALUE, + input CLOCK_ENABLE, + input INPUT_CLK, + input OUTPUT_CLK, + input OUTPUT_ENABLE, + input D_OUT_0, + input D_OUT_1, + output D_IN_0, + output D_IN_1 +); + parameter [5:0] PIN_TYPE = 6'b000000; + parameter [0:0] PULLUP = 1'b0; + parameter [0:0] NEG_TRIGGER = 1'b0; + parameter IO_STANDARD = "SB_LVCMOS"; + +`ifndef BLACKBOX + reg dout, din_0, din_1; + reg din_q_0, din_q_1; + reg dout_q_0, dout_q_1; + reg outena_q; + + generate if (!NEG_TRIGGER) begin + always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN; + always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN; + always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0; + always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1; + always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE; + end else begin + always @(negedge INPUT_CLK) if (CLOCK_ENABLE) din_q_0 <= PACKAGE_PIN; + always @(posedge INPUT_CLK) if (CLOCK_ENABLE) din_q_1 <= PACKAGE_PIN; + always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_0 <= D_OUT_0; + always @(posedge OUTPUT_CLK) if (CLOCK_ENABLE) dout_q_1 <= D_OUT_1; + always @(negedge OUTPUT_CLK) if (CLOCK_ENABLE) outena_q <= OUTPUT_ENABLE; + end endgenerate + + always @* begin + if (!PIN_TYPE[1] || !LATCH_INPUT_VALUE) + din_0 = PIN_TYPE[0] ? PACKAGE_PIN : din_q_0; + din_1 = din_q_1; + end + + // work around simulation glitches on dout in DDR mode + reg outclk_delayed_1; + reg outclk_delayed_2; + always @* outclk_delayed_1 <= OUTPUT_CLK; + always @* outclk_delayed_2 <= outclk_delayed_1; + + always @* begin + if (PIN_TYPE[3]) + dout = PIN_TYPE[2] ? !dout_q_0 : D_OUT_0; + else + dout = (outclk_delayed_2 ^ NEG_TRIGGER) || PIN_TYPE[2] ? dout_q_0 : dout_q_1; + end + + assign D_IN_0 = din_0, D_IN_1 = din_1; + + generate + if (PIN_TYPE[5:4] == 2'b01) assign PACKAGE_PIN = dout; + if (PIN_TYPE[5:4] == 2'b10) assign PACKAGE_PIN = OUTPUT_ENABLE ? dout : 1'bz; + if (PIN_TYPE[5:4] == 2'b11) assign PACKAGE_PIN = outena_q ? dout : 1'bz; + endgenerate +`endif +endmodule + +module SB_GB_IO ( + inout PACKAGE_PIN, + output GLOBAL_BUFFER_OUTPUT, + input LATCH_INPUT_VALUE, + input CLOCK_ENABLE, + input INPUT_CLK, + input OUTPUT_CLK, + input OUTPUT_ENABLE, + input D_OUT_0, + input D_OUT_1, + output D_IN_0, + output D_IN_1 +); + parameter [5:0] PIN_TYPE = 6'b000000; + parameter [0:0] PULLUP = 1'b0; + parameter [0:0] NEG_TRIGGER = 1'b0; + parameter IO_STANDARD = "SB_LVCMOS"; + + assign GLOBAL_BUFFER_OUTPUT = PACKAGE_PIN; + + SB_IO #( + .PIN_TYPE(PIN_TYPE), + .PULLUP(PULLUP), + .NEG_TRIGGER(NEG_TRIGGER), + .IO_STANDARD(IO_STANDARD) + ) IO ( + .PACKAGE_PIN(PACKAGE_PIN), + .LATCH_INPUT_VALUE(LATCH_INPUT_VALUE), + .CLOCK_ENABLE(CLOCK_ENABLE), + .INPUT_CLK(INPUT_CLK), + .OUTPUT_CLK(OUTPUT_CLK), + .OUTPUT_ENABLE(OUTPUT_ENABLE), + .D_OUT_0(D_OUT_0), + .D_OUT_1(D_OUT_1), + .D_IN_0(D_IN_0), + .D_IN_1(D_IN_1) + ); +endmodule + +module SB_GB ( + input USER_SIGNAL_TO_GLOBAL_BUFFER, + output GLOBAL_BUFFER_OUTPUT +); + assign GLOBAL_BUFFER_OUTPUT = USER_SIGNAL_TO_GLOBAL_BUFFER; +endmodule + +// SiliconBlue Logic Cells + +module SB_LUT4 (output O, input I0, I1, I2, I3); + parameter [15:0] LUT_INIT = 0; + wire [7:0] s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0]; + wire [3:0] s2 = I2 ? s3[ 7:4] : s3[3:0]; + wire [1:0] s1 = I1 ? s2[ 3:2] : s2[1:0]; + assign O = I0 ? s1[1] : s1[0]; +endmodule + +module SB_CARRY (output CO, input I0, I1, CI); + assign CO = (I0 && I1) || ((I0 || I1) && CI); +endmodule + +// Positive Edge SiliconBlue FF Cells + +module SB_DFF (output Q, input C, D); + `SB_DFF_REG + always @(posedge C) + Q <= D; +endmodule + +module SB_DFFE (output Q, input C, E, D); + `SB_DFF_REG + always @(posedge C) + if (E) + Q <= D; +endmodule + +module SB_DFFSR (output Q, input C, R, D); + `SB_DFF_REG + always @(posedge C) + if (R) + Q <= 0; + else + Q <= D; +endmodule + +module SB_DFFR (output Q, input C, R, D); + `SB_DFF_REG + always @(posedge C, posedge R) + if (R) + Q <= 0; + else + Q <= D; +endmodule + +module SB_DFFSS (output Q, input C, S, D); + `SB_DFF_REG + always @(posedge C) + if (S) + Q <= 1; + else + Q <= D; +endmodule + +module SB_DFFS (output Q, input C, S, D); + `SB_DFF_REG + always @(posedge C, posedge S) + if (S) + Q <= 1; + else + Q <= D; +endmodule + +module SB_DFFESR (output Q, input C, E, R, D); + `SB_DFF_REG + always @(posedge C) + if (E) begin + if (R) + Q <= 0; + else + Q <= D; + end +endmodule + +module SB_DFFER (output Q, input C, E, R, D); + `SB_DFF_REG + always @(posedge C, posedge R) + if (R) + Q <= 0; + else if (E) + Q <= D; +endmodule + +module SB_DFFESS (output Q, input C, E, S, D); + `SB_DFF_REG + always @(posedge C) + if (E) begin + if (S) + Q <= 1; + else + Q <= D; + end +endmodule + +module SB_DFFES (output Q, input C, E, S, D); + `SB_DFF_REG + always @(posedge C, posedge S) + if (S) + Q <= 1; + else if (E) + Q <= D; +endmodule + +// Negative Edge SiliconBlue FF Cells + +module SB_DFFN (output Q, input C, D); + `SB_DFF_REG + always @(negedge C) + Q <= D; +endmodule + +module SB_DFFNE (output Q, input C, E, D); + `SB_DFF_REG + always @(negedge C) + if (E) + Q <= D; +endmodule + +module SB_DFFNSR (output Q, input C, R, D); + `SB_DFF_REG + always @(negedge C) + if (R) + Q <= 0; + else + Q <= D; +endmodule + +module SB_DFFNR (output Q, input C, R, D); + `SB_DFF_REG + always @(negedge C, posedge R) + if (R) + Q <= 0; + else + Q <= D; +endmodule + +module SB_DFFNSS (output Q, input C, S, D); + `SB_DFF_REG + always @(negedge C) + if (S) + Q <= 1; + else + Q <= D; +endmodule + +module SB_DFFNS (output Q, input C, S, D); + `SB_DFF_REG + always @(negedge C, posedge S) + if (S) + Q <= 1; + else + Q <= D; +endmodule + +module SB_DFFNESR (output Q, input C, E, R, D); + `SB_DFF_REG + always @(negedge C) + if (E) begin + if (R) + Q <= 0; + else + Q <= D; + end +endmodule + +module SB_DFFNER (output Q, input C, E, R, D); + `SB_DFF_REG + always @(negedge C, posedge R) + if (R) + Q <= 0; + else if (E) + Q <= D; +endmodule + +module SB_DFFNESS (output Q, input C, E, S, D); + `SB_DFF_REG + always @(negedge C) + if (E) begin + if (S) + Q <= 1; + else + Q <= D; + end +endmodule + +module SB_DFFNES (output Q, input C, E, S, D); + `SB_DFF_REG + always @(negedge C, posedge S) + if (S) + Q <= 1; + else if (E) + Q <= D; +endmodule + +// SiliconBlue RAM Cells + +module SB_RAM40_4K ( + output [15:0] RDATA, + input RCLK, RCLKE, RE, + input [10:0] RADDR, + input WCLK, WCLKE, WE, + input [10:0] WADDR, + input [15:0] MASK, WDATA +); + // MODE 0: 256 x 16 + // MODE 1: 512 x 8 + // MODE 2: 1024 x 4 + // MODE 3: 2048 x 2 + parameter WRITE_MODE = 0; + parameter READ_MODE = 0; + + parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + +`ifndef BLACKBOX + wire [15:0] WMASK_I; + wire [15:0] RMASK_I; + + reg [15:0] RDATA_I; + wire [15:0] WDATA_I; + + generate + case (WRITE_MODE) + 0: assign WMASK_I = MASK; + + 1: assign WMASK_I = WADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 : + WADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx; + + 2: assign WMASK_I = WADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 : + WADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 : + WADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 : + WADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx; + + 3: assign WMASK_I = WADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 : + WADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 : + WADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 : + WADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 : + WADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 : + WADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 : + WADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 : + WADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx; + endcase + + case (READ_MODE) + 0: assign RMASK_I = 16'b 0000_0000_0000_0000; + + 1: assign RMASK_I = RADDR[ 8] == 0 ? 16'b 1010_1010_1010_1010 : + RADDR[ 8] == 1 ? 16'b 0101_0101_0101_0101 : 16'bx; + + 2: assign RMASK_I = RADDR[ 9:8] == 0 ? 16'b 1110_1110_1110_1110 : + RADDR[ 9:8] == 1 ? 16'b 1101_1101_1101_1101 : + RADDR[ 9:8] == 2 ? 16'b 1011_1011_1011_1011 : + RADDR[ 9:8] == 3 ? 16'b 0111_0111_0111_0111 : 16'bx; + + 3: assign RMASK_I = RADDR[10:8] == 0 ? 16'b 1111_1110_1111_1110 : + RADDR[10:8] == 1 ? 16'b 1111_1101_1111_1101 : + RADDR[10:8] == 2 ? 16'b 1111_1011_1111_1011 : + RADDR[10:8] == 3 ? 16'b 1111_0111_1111_0111 : + RADDR[10:8] == 4 ? 16'b 1110_1111_1110_1111 : + RADDR[10:8] == 5 ? 16'b 1101_1111_1101_1111 : + RADDR[10:8] == 6 ? 16'b 1011_1111_1011_1111 : + RADDR[10:8] == 7 ? 16'b 0111_1111_0111_1111 : 16'bx; + endcase + + case (WRITE_MODE) + 0: assign WDATA_I = WDATA; + + 1: assign WDATA_I = {WDATA[14], WDATA[14], WDATA[12], WDATA[12], + WDATA[10], WDATA[10], WDATA[ 8], WDATA[ 8], + WDATA[ 6], WDATA[ 6], WDATA[ 4], WDATA[ 4], + WDATA[ 2], WDATA[ 2], WDATA[ 0], WDATA[ 0]}; + + 2: assign WDATA_I = {WDATA[13], WDATA[13], WDATA[13], WDATA[13], + WDATA[ 9], WDATA[ 9], WDATA[ 9], WDATA[ 9], + WDATA[ 5], WDATA[ 5], WDATA[ 5], WDATA[ 5], + WDATA[ 1], WDATA[ 1], WDATA[ 1], WDATA[ 1]}; + + 3: assign WDATA_I = {WDATA[11], WDATA[11], WDATA[11], WDATA[11], + WDATA[11], WDATA[11], WDATA[11], WDATA[11], + WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3], + WDATA[ 3], WDATA[ 3], WDATA[ 3], WDATA[ 3]}; + endcase + + case (READ_MODE) + 0: assign RDATA = RDATA_I; + 1: assign RDATA = {1'b0, |RDATA_I[15:14], 1'b0, |RDATA_I[13:12], 1'b0, |RDATA_I[11:10], 1'b0, |RDATA_I[ 9: 8], + 1'b0, |RDATA_I[ 7: 6], 1'b0, |RDATA_I[ 5: 4], 1'b0, |RDATA_I[ 3: 2], 1'b0, |RDATA_I[ 1: 0]}; + 2: assign RDATA = {2'b0, |RDATA_I[15:12], 3'b0, |RDATA_I[11: 8], 3'b0, |RDATA_I[ 7: 4], 3'b0, |RDATA_I[ 3: 0], 1'b0}; + 3: assign RDATA = {4'b0, |RDATA_I[15: 8], 7'b0, |RDATA_I[ 7: 0], 3'b0}; + endcase + endgenerate + + integer i; + reg [15:0] memory [0:255]; + + initial begin + for (i=0; i<16; i=i+1) begin + memory[ 0*16 + i] <= INIT_0[16*i +: 16]; + memory[ 1*16 + i] <= INIT_1[16*i +: 16]; + memory[ 2*16 + i] <= INIT_2[16*i +: 16]; + memory[ 3*16 + i] <= INIT_3[16*i +: 16]; + memory[ 4*16 + i] <= INIT_4[16*i +: 16]; + memory[ 5*16 + i] <= INIT_5[16*i +: 16]; + memory[ 6*16 + i] <= INIT_6[16*i +: 16]; + memory[ 7*16 + i] <= INIT_7[16*i +: 16]; + memory[ 8*16 + i] <= INIT_8[16*i +: 16]; + memory[ 9*16 + i] <= INIT_9[16*i +: 16]; + memory[10*16 + i] <= INIT_A[16*i +: 16]; + memory[11*16 + i] <= INIT_B[16*i +: 16]; + memory[12*16 + i] <= INIT_C[16*i +: 16]; + memory[13*16 + i] <= INIT_D[16*i +: 16]; + memory[14*16 + i] <= INIT_E[16*i +: 16]; + memory[15*16 + i] <= INIT_F[16*i +: 16]; + end + end + + always @(posedge WCLK) begin + if (WE && WCLKE) begin + if (!WMASK_I[ 0]) memory[WADDR[7:0]][ 0] <= WDATA_I[ 0]; + if (!WMASK_I[ 1]) memory[WADDR[7:0]][ 1] <= WDATA_I[ 1]; + if (!WMASK_I[ 2]) memory[WADDR[7:0]][ 2] <= WDATA_I[ 2]; + if (!WMASK_I[ 3]) memory[WADDR[7:0]][ 3] <= WDATA_I[ 3]; + if (!WMASK_I[ 4]) memory[WADDR[7:0]][ 4] <= WDATA_I[ 4]; + if (!WMASK_I[ 5]) memory[WADDR[7:0]][ 5] <= WDATA_I[ 5]; + if (!WMASK_I[ 6]) memory[WADDR[7:0]][ 6] <= WDATA_I[ 6]; + if (!WMASK_I[ 7]) memory[WADDR[7:0]][ 7] <= WDATA_I[ 7]; + if (!WMASK_I[ 8]) memory[WADDR[7:0]][ 8] <= WDATA_I[ 8]; + if (!WMASK_I[ 9]) memory[WADDR[7:0]][ 9] <= WDATA_I[ 9]; + if (!WMASK_I[10]) memory[WADDR[7:0]][10] <= WDATA_I[10]; + if (!WMASK_I[11]) memory[WADDR[7:0]][11] <= WDATA_I[11]; + if (!WMASK_I[12]) memory[WADDR[7:0]][12] <= WDATA_I[12]; + if (!WMASK_I[13]) memory[WADDR[7:0]][13] <= WDATA_I[13]; + if (!WMASK_I[14]) memory[WADDR[7:0]][14] <= WDATA_I[14]; + if (!WMASK_I[15]) memory[WADDR[7:0]][15] <= WDATA_I[15]; + end + end + + always @(posedge RCLK) begin + if (RE && RCLKE) begin + RDATA_I <= memory[RADDR[7:0]] & ~RMASK_I; + end + end +`endif +endmodule + +module SB_RAM40_4KNR ( + output [15:0] RDATA, + input RCLKN, RCLKE, RE, + input [10:0] RADDR, + input WCLK, WCLKE, WE, + input [10:0] WADDR, + input [15:0] MASK, WDATA +); + parameter WRITE_MODE = 0; + parameter READ_MODE = 0; + + parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + + SB_RAM40_4K #( + .WRITE_MODE(WRITE_MODE), + .READ_MODE (READ_MODE ), + .INIT_0 (INIT_0 ), + .INIT_1 (INIT_1 ), + .INIT_2 (INIT_2 ), + .INIT_3 (INIT_3 ), + .INIT_4 (INIT_4 ), + .INIT_5 (INIT_5 ), + .INIT_6 (INIT_6 ), + .INIT_7 (INIT_7 ), + .INIT_8 (INIT_8 ), + .INIT_9 (INIT_9 ), + .INIT_A (INIT_A ), + .INIT_B (INIT_B ), + .INIT_C (INIT_C ), + .INIT_D (INIT_D ), + .INIT_E (INIT_E ), + .INIT_F (INIT_F ) + ) RAM ( + .RDATA(RDATA), + .RCLK (~RCLKN), + .RCLKE(RCLKE), + .RE (RE ), + .RADDR(RADDR), + .WCLK (WCLK ), + .WCLKE(WCLKE), + .WE (WE ), + .WADDR(WADDR), + .MASK (MASK ), + .WDATA(WDATA) + ); +endmodule + +module SB_RAM40_4KNW ( + output [15:0] RDATA, + input RCLK, RCLKE, RE, + input [10:0] RADDR, + input WCLKN, WCLKE, WE, + input [10:0] WADDR, + input [15:0] MASK, WDATA +); + parameter WRITE_MODE = 0; + parameter READ_MODE = 0; + + parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + + SB_RAM40_4K #( + .WRITE_MODE(WRITE_MODE), + .READ_MODE (READ_MODE ), + .INIT_0 (INIT_0 ), + .INIT_1 (INIT_1 ), + .INIT_2 (INIT_2 ), + .INIT_3 (INIT_3 ), + .INIT_4 (INIT_4 ), + .INIT_5 (INIT_5 ), + .INIT_6 (INIT_6 ), + .INIT_7 (INIT_7 ), + .INIT_8 (INIT_8 ), + .INIT_9 (INIT_9 ), + .INIT_A (INIT_A ), + .INIT_B (INIT_B ), + .INIT_C (INIT_C ), + .INIT_D (INIT_D ), + .INIT_E (INIT_E ), + .INIT_F (INIT_F ) + ) RAM ( + .RDATA(RDATA), + .RCLK (RCLK ), + .RCLKE(RCLKE), + .RE (RE ), + .RADDR(RADDR), + .WCLK (~WCLKN), + .WCLKE(WCLKE), + .WE (WE ), + .WADDR(WADDR), + .MASK (MASK ), + .WDATA(WDATA) + ); +endmodule + +module SB_RAM40_4KNRNW ( + output [15:0] RDATA, + input RCLKN, RCLKE, RE, + input [10:0] RADDR, + input WCLKN, WCLKE, WE, + input [10:0] WADDR, + input [15:0] MASK, WDATA +); + parameter WRITE_MODE = 0; + parameter READ_MODE = 0; + + parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + + SB_RAM40_4K #( + .WRITE_MODE(WRITE_MODE), + .READ_MODE (READ_MODE ), + .INIT_0 (INIT_0 ), + .INIT_1 (INIT_1 ), + .INIT_2 (INIT_2 ), + .INIT_3 (INIT_3 ), + .INIT_4 (INIT_4 ), + .INIT_5 (INIT_5 ), + .INIT_6 (INIT_6 ), + .INIT_7 (INIT_7 ), + .INIT_8 (INIT_8 ), + .INIT_9 (INIT_9 ), + .INIT_A (INIT_A ), + .INIT_B (INIT_B ), + .INIT_C (INIT_C ), + .INIT_D (INIT_D ), + .INIT_E (INIT_E ), + .INIT_F (INIT_F ) + ) RAM ( + .RDATA(RDATA), + .RCLK (~RCLKN), + .RCLKE(RCLKE), + .RE (RE ), + .RADDR(RADDR), + .WCLK (~WCLKN), + .WCLKE(WCLKE), + .WE (WE ), + .WADDR(WADDR), + .MASK (MASK ), + .WDATA(WDATA) + ); +endmodule + +// Packed IceStorm Logic Cells + +module ICESTORM_LC ( + input I0, I1, I2, I3, CIN, CLK, CEN, SR, + output LO, O, COUT +); + parameter [15:0] LUT_INIT = 0; + + parameter [0:0] NEG_CLK = 0; + parameter [0:0] CARRY_ENABLE = 0; + parameter [0:0] DFF_ENABLE = 0; + parameter [0:0] SET_NORESET = 0; + parameter [0:0] ASYNC_SR = 0; + + wire COUT = CARRY_ENABLE ? (I1 && I2) || ((I1 || I2) && CIN) : 1'bx; + + wire [7:0] lut_s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0]; + wire [3:0] lut_s2 = I2 ? lut_s3[ 7:4] : lut_s3[3:0]; + wire [1:0] lut_s1 = I1 ? lut_s2[ 3:2] : lut_s2[1:0]; + wire lut_o = I0 ? lut_s1[ 1] : lut_s1[ 0]; + + assign LO = lut_o; + + wire polarized_clk; + assign polarized_clk = CLK ^ NEG_CLK; + + reg o_reg; + always @(posedge polarized_clk) + if (CEN) + o_reg <= SR ? SET_NORESET : lut_o; + + reg o_reg_async; + always @(posedge polarized_clk, posedge SR) + if (SR) + o_reg <= SET_NORESET; + else if (CEN) + o_reg <= lut_o; + + assign O = DFF_ENABLE ? ASYNC_SR ? o_reg_async : o_reg : lut_o; +endmodule + +// SiliconBlue PLL Cells + +(* blackbox *) +module SB_PLL40_CORE ( + input REFERENCECLK, + output PLLOUTCORE, + output PLLOUTGLOBAL, + input EXTFEEDBACK, + input [7:0] DYNAMICDELAY, + output LOCK, + input BYPASS, + input RESETB, + input LATCHINPUTVALUE, + output SDO, + input SDI, + input SCLK +); + parameter FEEDBACK_PATH = "SIMPLE"; + parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED"; + parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED"; + parameter SHIFTREG_DIV_MODE = 1'b0; + parameter FDA_FEEDBACK = 4'b0000; + parameter FDA_RELATIVE = 4'b0000; + parameter PLLOUT_SELECT = "GENCLK"; + parameter DIVR = 4'b0000; + parameter DIVF = 7'b0000000; + parameter DIVQ = 3'b000; + parameter FILTER_RANGE = 3'b000; + parameter ENABLE_ICEGATE = 1'b0; + parameter TEST_MODE = 1'b0; + parameter EXTERNAL_DIVIDE_FACTOR = 1; +endmodule + +(* blackbox *) +module SB_PLL40_PAD ( + input PACKAGEPIN, + output PLLOUTCORE, + output PLLOUTGLOBAL, + input EXTFEEDBACK, + input [7:0] DYNAMICDELAY, + output LOCK, + input BYPASS, + input RESETB, + input LATCHINPUTVALUE, + output SDO, + input SDI, + input SCLK +); + parameter FEEDBACK_PATH = "SIMPLE"; + parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED"; + parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED"; + parameter SHIFTREG_DIV_MODE = 1'b0; + parameter FDA_FEEDBACK = 4'b0000; + parameter FDA_RELATIVE = 4'b0000; + parameter PLLOUT_SELECT = "GENCLK"; + parameter DIVR = 4'b0000; + parameter DIVF = 7'b0000000; + parameter DIVQ = 3'b000; + parameter FILTER_RANGE = 3'b000; + parameter ENABLE_ICEGATE = 1'b0; + parameter TEST_MODE = 1'b0; + parameter EXTERNAL_DIVIDE_FACTOR = 1; +endmodule + +(* blackbox *) +module SB_PLL40_2_PAD ( + input PACKAGEPIN, + output PLLOUTCOREA, + output PLLOUTGLOBALA, + output PLLOUTCOREB, + output PLLOUTGLOBALB, + input EXTFEEDBACK, + input [7:0] DYNAMICDELAY, + output LOCK, + input BYPASS, + input RESETB, + input LATCHINPUTVALUE, + output SDO, + input SDI, + input SCLK +); + parameter FEEDBACK_PATH = "SIMPLE"; + parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED"; + parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED"; + parameter SHIFTREG_DIV_MODE = 1'b0; + parameter FDA_FEEDBACK = 4'b0000; + parameter FDA_RELATIVE = 4'b0000; + parameter PLLOUT_SELECT_PORTB = "GENCLK"; + parameter DIVR = 4'b0000; + parameter DIVF = 7'b0000000; + parameter DIVQ = 3'b000; + parameter FILTER_RANGE = 3'b000; + parameter ENABLE_ICEGATE_PORTA = 1'b0; + parameter ENABLE_ICEGATE_PORTB = 1'b0; + parameter TEST_MODE = 1'b0; + parameter EXTERNAL_DIVIDE_FACTOR = 1; +endmodule + +(* blackbox *) +module SB_PLL40_2F_CORE ( + input REFERENCECLK, + output PLLOUTCOREA, + output PLLOUTGLOBALA, + output PLLOUTCOREB, + output PLLOUTGLOBALB, + input EXTFEEDBACK, + input [7:0] DYNAMICDELAY, + output LOCK, + input BYPASS, + input RESETB, + input LATCHINPUTVALUE, + output SDO, + input SDI, + input SCLK +); + parameter FEEDBACK_PATH = "SIMPLE"; + parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED"; + parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED"; + parameter SHIFTREG_DIV_MODE = 1'b0; + parameter FDA_FEEDBACK = 4'b0000; + parameter FDA_RELATIVE = 4'b0000; + parameter PLLOUT_SELECT_PORTA = "GENCLK"; + parameter PLLOUT_SELECT_PORTB = "GENCLK"; + parameter DIVR = 4'b0000; + parameter DIVF = 7'b0000000; + parameter DIVQ = 3'b000; + parameter FILTER_RANGE = 3'b000; + parameter ENABLE_ICEGATE_PORTA = 1'b0; + parameter ENABLE_ICEGATE_PORTB = 1'b0; + parameter TEST_MODE = 1'b0; + parameter EXTERNAL_DIVIDE_FACTOR = 1; +endmodule + +(* blackbox *) +module SB_PLL40_2F_PAD ( + input PACKAGEPIN, + output PLLOUTCOREA, + output PLLOUTGLOBALA, + output PLLOUTCOREB, + output PLLOUTGLOBALB, + input EXTFEEDBACK, + input [7:0] DYNAMICDELAY, + output LOCK, + input BYPASS, + input RESETB, + input LATCHINPUTVALUE, + output SDO, + input SDI, + input SCLK +); + parameter FEEDBACK_PATH = "SIMPLE"; + parameter DELAY_ADJUSTMENT_MODE_FEEDBACK = "FIXED"; + parameter DELAY_ADJUSTMENT_MODE_RELATIVE = "FIXED"; + parameter SHIFTREG_DIV_MODE = 2'b00; + parameter FDA_FEEDBACK = 4'b0000; + parameter FDA_RELATIVE = 4'b0000; + parameter PLLOUT_SELECT_PORTA = "GENCLK"; + parameter PLLOUT_SELECT_PORTB = "GENCLK"; + parameter DIVR = 4'b0000; + parameter DIVF = 7'b0000000; + parameter DIVQ = 3'b000; + parameter FILTER_RANGE = 3'b000; + parameter ENABLE_ICEGATE_PORTA = 1'b0; + parameter ENABLE_ICEGATE_PORTB = 1'b0; + parameter TEST_MODE = 1'b0; + parameter EXTERNAL_DIVIDE_FACTOR = 1; +endmodule + +// SiliconBlue Device Configuration Cells + +(* blackbox, keep *) +module SB_WARMBOOT ( + input BOOT, + input S1, + input S0 +); +endmodule diff --git a/verilog/windows/autoyosys/share/ice40/latches_map.v b/verilog/windows/autoyosys/share/ice40/latches_map.v new file mode 100644 index 0000000..c28f88c --- /dev/null +++ b/verilog/windows/autoyosys/share/ice40/latches_map.v @@ -0,0 +1,11 @@ +module \$_DLATCH_N_ (E, D, Q); + wire [1023:0] _TECHMAP_DO_ = "simplemap; opt"; + input E, D; + output Q = !E ? D : Q; +endmodule + +module \$_DLATCH_P_ (E, D, Q); + wire [1023:0] _TECHMAP_DO_ = "simplemap; opt"; + input E, D; + output Q = E ? D : Q; +endmodule diff --git a/verilog/windows/autoyosys/share/include/backends/ilang/ilang_backend.h b/verilog/windows/autoyosys/share/include/backends/ilang/ilang_backend.h new file mode 100644 index 0000000..97dcbb6 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/backends/ilang/ilang_backend.h @@ -0,0 +1,51 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * A very simple and straightforward backend for the RTLIL text + * representation (as understood by the 'ilang' frontend). + * + */ + +#ifndef ILANG_BACKEND_H +#define ILANG_BACKEND_H + +#include "kernel/yosys.h" +#include + +YOSYS_NAMESPACE_BEGIN + +namespace ILANG_BACKEND { + void dump_const(std::ostream &f, const RTLIL::Const &data, int width = -1, int offset = 0, bool autoint = true); + void dump_sigchunk(std::ostream &f, const RTLIL::SigChunk &chunk, bool autoint = true); + void dump_sigspec(std::ostream &f, const RTLIL::SigSpec &sig, bool autoint = true); + void dump_wire(std::ostream &f, std::string indent, const RTLIL::Wire *wire); + void dump_memory(std::ostream &f, std::string indent, const RTLIL::Memory *memory); + void dump_cell(std::ostream &f, std::string indent, const RTLIL::Cell *cell); + void dump_proc_case_body(std::ostream &f, std::string indent, const RTLIL::CaseRule *cs); + void dump_proc_switch(std::ostream &f, std::string indent, const RTLIL::SwitchRule *sw); + void dump_proc_sync(std::ostream &f, std::string indent, const RTLIL::SyncRule *sy); + void dump_proc(std::ostream &f, std::string indent, const RTLIL::Process *proc); + void dump_conn(std::ostream &f, std::string indent, const RTLIL::SigSpec &left, const RTLIL::SigSpec &right); + void dump_module(std::ostream &f, std::string indent, RTLIL::Module *module, RTLIL::Design *design, bool only_selected, bool flag_m = true, bool flag_n = false); + void dump_design(std::ostream &f, RTLIL::Design *design, bool only_selected, bool flag_m = true, bool flag_n = false); +} + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/frontends/ast/ast.h b/verilog/windows/autoyosys/share/include/frontends/ast/ast.h new file mode 100644 index 0000000..cd6e264 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/frontends/ast/ast.h @@ -0,0 +1,319 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * This is the AST frontend library. + * + * The AST frontend library is not a frontend on it's own but provides a + * generic abstract syntax tree (AST) abstraction for HDL code and can be + * used by HDL frontends. See "ast.h" for an overview of the API and the + * Verilog frontend for an usage example. + * + */ + +#ifndef AST_H +#define AST_H + +#include "kernel/rtlil.h" +#include +#include + +YOSYS_NAMESPACE_BEGIN + +namespace AST +{ + // all node types, type2str() must be extended + // whenever a new node type is added here + enum AstNodeType + { + AST_NONE, + AST_DESIGN, + AST_MODULE, + AST_TASK, + AST_FUNCTION, + AST_DPI_FUNCTION, + + AST_WIRE, + AST_MEMORY, + AST_AUTOWIRE, + AST_PARAMETER, + AST_LOCALPARAM, + AST_DEFPARAM, + AST_PARASET, + AST_ARGUMENT, + AST_RANGE, + AST_MULTIRANGE, + AST_CONSTANT, + AST_REALVALUE, + AST_CELLTYPE, + AST_IDENTIFIER, + AST_PREFIX, + AST_ASSERT, + AST_ASSUME, + + AST_FCALL, + AST_TO_BITS, + AST_TO_SIGNED, + AST_TO_UNSIGNED, + AST_CONCAT, + AST_REPLICATE, + AST_BIT_NOT, + AST_BIT_AND, + AST_BIT_OR, + AST_BIT_XOR, + AST_BIT_XNOR, + AST_REDUCE_AND, + AST_REDUCE_OR, + AST_REDUCE_XOR, + AST_REDUCE_XNOR, + AST_REDUCE_BOOL, + AST_SHIFT_LEFT, + AST_SHIFT_RIGHT, + AST_SHIFT_SLEFT, + AST_SHIFT_SRIGHT, + AST_LT, + AST_LE, + AST_EQ, + AST_NE, + AST_EQX, + AST_NEX, + AST_GE, + AST_GT, + AST_ADD, + AST_SUB, + AST_MUL, + AST_DIV, + AST_MOD, + AST_POW, + AST_POS, + AST_NEG, + AST_LOGIC_AND, + AST_LOGIC_OR, + AST_LOGIC_NOT, + AST_TERNARY, + AST_MEMRD, + AST_MEMWR, + AST_MEMINIT, + + AST_TCALL, + AST_ASSIGN, + AST_CELL, + AST_PRIMITIVE, + AST_CELLARRAY, + AST_ALWAYS, + AST_INITIAL, + AST_BLOCK, + AST_ASSIGN_EQ, + AST_ASSIGN_LE, + AST_CASE, + AST_COND, + AST_CONDX, + AST_CONDZ, + AST_DEFAULT, + AST_FOR, + AST_WHILE, + AST_REPEAT, + + AST_GENVAR, + AST_GENFOR, + AST_GENIF, + AST_GENCASE, + AST_GENBLOCK, + + AST_POSEDGE, + AST_NEGEDGE, + AST_EDGE, + + AST_PACKAGE + }; + + // convert an node type to a string (e.g. for debug output) + std::string type2str(AstNodeType type); + + // The AST is built using instances of this struct + struct AstNode + { + // for dict<> and pool<> + unsigned int hashidx_; + unsigned int hash() const { return hashidx_; } + + // this nodes type + AstNodeType type; + + // the list of child nodes for this node + std::vector children; + + // the list of attributes assigned to this node + std::map attributes; + bool get_bool_attribute(RTLIL::IdString id); + + // node content - most of it is unused in most node types + std::string str; + std::vector bits; + bool is_input, is_output, is_reg, is_signed, is_string, range_valid, range_swapped; + int port_id, range_left, range_right; + uint32_t integer; + double realvalue; + + // if this is a multirange memory then this vector contains offset and length of each dimension + std::vector multirange_dimensions; + + // this is set by simplify and used during RTLIL generation + AstNode *id2ast; + + // this is used by simplify to detect if basic analysis has been performed already on the node + bool basic_prep; + + // this is the original sourcecode location that resulted in this AST node + // it is automatically set by the constructor using AST::current_filename and + // the AST::get_line_num() callback function. + std::string filename; + int linenum; + + // creating and deleting nodes + AstNode(AstNodeType type = AST_NONE, AstNode *child1 = NULL, AstNode *child2 = NULL, AstNode *child3 = NULL); + AstNode *clone(); + void cloneInto(AstNode *other); + void delete_children(); + ~AstNode(); + + enum mem2reg_flags + { + /* status flags */ + MEM2REG_FL_ALL = 0x00000001, + MEM2REG_FL_ASYNC = 0x00000002, + MEM2REG_FL_INIT = 0x00000004, + + /* candidate flags */ + MEM2REG_FL_FORCED = 0x00000100, + MEM2REG_FL_SET_INIT = 0x00000200, + MEM2REG_FL_SET_ELSE = 0x00000400, + MEM2REG_FL_SET_ASYNC = 0x00000800, + MEM2REG_FL_EQ2 = 0x00001000, + MEM2REG_FL_CMPLX_LHS = 0x00002000, + + /* proc flags */ + MEM2REG_FL_EQ1 = 0x01000000, + }; + + // simplify() creates a simpler AST by unrolling for-loops, expanding generate blocks, etc. + // it also sets the id2ast pointers so that identifier lookups are fast in genRTLIL() + bool simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage, int width_hint, bool sign_hint, bool in_param); + AstNode *readmem(bool is_readmemh, std::string mem_filename, AstNode *memory, int start_addr, int finish_addr, bool unconditional_init); + void expand_genblock(std::string index_var, std::string prefix, std::map &name_map); + void replace_ids(const std::string &prefix, const std::map &rules); + void mem2reg_as_needed_pass1(dict> &mem2reg_places, + dict &mem2reg_flags, dict &proc_flags, uint32_t &status_flags); + bool mem2reg_as_needed_pass2(pool &mem2reg_set, AstNode *mod, AstNode *block, AstNode *&async_block); + bool mem2reg_check(pool &mem2reg_set); + void mem2reg_remove(pool &mem2reg_set, vector &delnodes); + void meminfo(int &mem_width, int &mem_size, int &addr_bits); + + // additional functionality for evaluating constant functions + struct varinfo_t { RTLIL::Const val; int offset; bool is_signed; }; + bool has_const_only_constructs(bool &recommend_const_eval); + void replace_variables(std::map &variables, AstNode *fcall); + AstNode *eval_const_function(AstNode *fcall); + + // create a human-readable text representation of the AST (for debugging) + void dumpAst(FILE *f, std::string indent); + void dumpVlog(FILE *f, std::string indent); + + // used by genRTLIL() for detecting expression width and sign + void detectSignWidthWorker(int &width_hint, bool &sign_hint, bool *found_real = NULL); + void detectSignWidth(int &width_hint, bool &sign_hint, bool *found_real = NULL); + + // create RTLIL code for this AST node + // for expressions the resulting signal vector is returned + // all generated cell instances, etc. are written to the RTLIL::Module pointed to by AST_INTERNAL::current_module + RTLIL::SigSpec genRTLIL(int width_hint = -1, bool sign_hint = false); + RTLIL::SigSpec genWidthRTLIL(int width, const dict *new_subst_ptr = NULL); + + // compare AST nodes + bool operator==(const AstNode &other) const; + bool operator!=(const AstNode &other) const; + bool contains(const AstNode *other) const; + + // helper functions for creating AST nodes for constants + static AstNode *mkconst_int(uint32_t v, bool is_signed, int width = 32); + static AstNode *mkconst_bits(const std::vector &v, bool is_signed); + static AstNode *mkconst_str(const std::vector &v); + static AstNode *mkconst_str(const std::string &str); + + // helper function for creating sign-extended const objects + RTLIL::Const bitsAsConst(int width, bool is_signed); + RTLIL::Const bitsAsConst(int width = -1); + RTLIL::Const asAttrConst(); + RTLIL::Const asParaConst(); + uint64_t asInt(bool is_signed); + bool bits_only_01(); + bool asBool(); + + // helper functions for real valued const eval + int isConst(); // return '1' for AST_CONSTANT and '2' for AST_REALVALUE + double asReal(bool is_signed); + RTLIL::Const realAsConst(int width); + }; + + // process an AST tree (ast must point to an AST_DESIGN node) and generate RTLIL code + void process(RTLIL::Design *design, AstNode *ast, bool dump_ast1, bool dump_ast2, bool dump_vlog, bool dump_rtlil, bool nolatches, bool nomeminit, + bool nomem2reg, bool mem2reg, bool lib, bool noopt, bool icells, bool ignore_redef, bool defer, bool autowire); + + // parametric modules are supported directly by the AST library + // therefore we need our own derivate of RTLIL::Module with overloaded virtual functions + struct AstModule : RTLIL::Module { + AstNode *ast; + bool nolatches, nomeminit, nomem2reg, mem2reg, lib, noopt, icells, autowire; + virtual ~AstModule(); + virtual RTLIL::IdString derive(RTLIL::Design *design, dict parameters); + virtual RTLIL::Module *clone() const; + }; + + // this must be set by the language frontend before parsing the sources + // the AstNode constructor then uses current_filename and get_line_num() + // to initialize the filename and linenum properties of new nodes + extern std::string current_filename; + extern void (*set_line_num)(int); + extern int (*get_line_num)(); + + // set set_line_num and get_line_num to internal dummy functions (done by simplify() and AstModule::derive + // to control the filename and linenum properties of new nodes not generated by a frontend parser) + void use_internal_line_num(); + + // call a DPI function + AstNode *dpi_call(const std::string &rtype, const std::string &fname, const std::vector &argtypes, const std::vector &args); +} + +namespace AST_INTERNAL +{ + // internal state variables + extern bool flag_dump_ast1, flag_dump_ast2, flag_dump_rtlil, flag_nolatches, flag_nomeminit; + extern bool flag_nomem2reg, flag_mem2reg, flag_lib, flag_noopt, flag_icells, flag_autowire; + extern AST::AstNode *current_ast, *current_ast_mod; + extern std::map current_scope; + extern const dict *genRTLIL_subst_ptr; + extern RTLIL::SigSpec ignoreThisSignalsInInitial; + extern AST::AstNode *current_always, *current_top_block, *current_block, *current_block_child; + extern AST::AstModule *current_module; + extern bool current_always_clocked; + struct ProcessGenerator; +} + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/celledges.h b/verilog/windows/autoyosys/share/include/kernel/celledges.h new file mode 100644 index 0000000..6aab9ed --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/celledges.h @@ -0,0 +1,63 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef CELLEDGES_H +#define CELLEDGES_H + +#include "kernel/yosys.h" +#include "kernel/sigtools.h" + +YOSYS_NAMESPACE_BEGIN + +struct AbstractCellEdgesDatabase +{ + virtual ~AbstractCellEdgesDatabase() { } + virtual void add_edge(RTLIL::Cell *cell, RTLIL::IdString from_port, int from_bit, RTLIL::IdString to_port, int to_bit, int delay) = 0; + bool add_edges_from_cell(RTLIL::Cell *cell); +}; + +struct FwdCellEdgesDatabase : AbstractCellEdgesDatabase +{ + SigMap &sigmap; + dict> db; + FwdCellEdgesDatabase(SigMap &sigmap) : sigmap(sigmap) { } + + virtual void add_edge(RTLIL::Cell *cell, RTLIL::IdString from_port, int from_bit, RTLIL::IdString to_port, int to_bit, int) override { + SigBit from_sigbit = sigmap(cell->getPort(from_port)[from_bit]); + SigBit to_sigbit = sigmap(cell->getPort(to_port)[to_bit]); + db[from_sigbit].insert(to_sigbit); + } +}; + +struct RevCellEdgesDatabase : AbstractCellEdgesDatabase +{ + SigMap &sigmap; + dict> db; + RevCellEdgesDatabase(SigMap &sigmap) : sigmap(sigmap) { } + + virtual void add_edge(RTLIL::Cell *cell, RTLIL::IdString from_port, int from_bit, RTLIL::IdString to_port, int to_bit, int) override { + SigBit from_sigbit = sigmap(cell->getPort(from_port)[from_bit]); + SigBit to_sigbit = sigmap(cell->getPort(to_port)[to_bit]); + db[to_sigbit].insert(from_sigbit); + } +}; + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/celltypes.h b/verilog/windows/autoyosys/share/include/kernel/celltypes.h new file mode 100644 index 0000000..f0ead1e --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/celltypes.h @@ -0,0 +1,449 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef CELLTYPES_H +#define CELLTYPES_H + +#include + +YOSYS_NAMESPACE_BEGIN + +struct CellType +{ + RTLIL::IdString type; + pool inputs, outputs; + bool is_evaluable; +}; + +struct CellTypes +{ + dict cell_types; + + CellTypes() + { + } + + CellTypes(RTLIL::Design *design) + { + setup(design); + } + + void setup(RTLIL::Design *design = NULL) + { + if (design) + setup_design(design); + + setup_internals(); + setup_internals_mem(); + setup_stdcells(); + setup_stdcells_mem(); + } + + void setup_type(RTLIL::IdString type, const pool &inputs, const pool &outputs, bool is_evaluable = false) + { + CellType ct = {type, inputs, outputs, is_evaluable}; + cell_types[ct.type] = ct; + } + + void setup_module(RTLIL::Module *module) + { + pool inputs, outputs; + for (RTLIL::IdString wire_name : module->ports) { + RTLIL::Wire *wire = module->wire(wire_name); + if (wire->port_input) + inputs.insert(wire->name); + if (wire->port_output) + outputs.insert(wire->name); + } + setup_type(module->name, inputs, outputs); + } + + void setup_design(RTLIL::Design *design) + { + for (auto module : design->modules()) + setup_module(module); + } + + void setup_internals() + { + std::vector unary_ops = { + "$not", "$pos", "$neg", + "$reduce_and", "$reduce_or", "$reduce_xor", "$reduce_xnor", "$reduce_bool", + "$logic_not", "$slice", "$lut", "$sop" + }; + + std::vector binary_ops = { + "$and", "$or", "$xor", "$xnor", + "$shl", "$shr", "$sshl", "$sshr", "$shift", "$shiftx", + "$lt", "$le", "$eq", "$ne", "$eqx", "$nex", "$ge", "$gt", + "$add", "$sub", "$mul", "$div", "$mod", "$pow", + "$logic_and", "$logic_or", "$concat", "$macc" + }; + IdString A = "\\A", B = "\\B", S = "\\S", Y = "\\Y"; + IdString P = "\\P", G = "\\G", C = "\\C", X = "\\X"; + IdString BI = "\\BI", CI = "\\CI", CO = "\\CO", EN = "\\EN"; + + for (auto type : unary_ops) + setup_type(type, {A}, {Y}, true); + + for (auto type : binary_ops) + setup_type(type, {A, B}, {Y}, true); + + for (auto type : std::vector({"$mux", "$pmux"})) + setup_type(type, {A, B, S}, {Y}, true); + + setup_type("$lcu", {P, G, CI}, {CO}, true); + setup_type("$alu", {A, B, CI, BI}, {X, Y, CO}, true); + setup_type("$fa", {A, B, C}, {X, Y}, true); + + setup_type("$tribuf", {A, EN}, {Y}, true); + + setup_type("$assert", {A, EN}, pool(), true); + setup_type("$assume", {A, EN}, pool(), true); + setup_type("$initstate", pool(), {Y}, true); + setup_type("$anyconst", pool(), {Y}, true); + setup_type("$anyseq", pool(), {Y}, true); + setup_type("$equiv", {A, B}, {Y}, true); + } + + void setup_internals_mem() + { + IdString SET = "\\SET", CLR = "\\CLR", CLK = "\\CLK", ARST = "\\ARST", EN = "\\EN"; + IdString Q = "\\Q", D = "\\D", ADDR = "\\ADDR", DATA = "\\DATA", RD_EN = "\\RD_EN"; + IdString RD_CLK = "\\RD_CLK", RD_ADDR = "\\RD_ADDR", WR_CLK = "\\WR_CLK", WR_EN = "\\WR_EN"; + IdString WR_ADDR = "\\WR_ADDR", WR_DATA = "\\WR_DATA", RD_DATA = "\\RD_DATA"; + IdString CTRL_IN = "\\CTRL_IN", CTRL_OUT = "\\CTRL_OUT"; + + setup_type("$sr", {SET, CLR}, {Q}); + setup_type("$ff", {D}, {Q}); + setup_type("$dff", {CLK, D}, {Q}); + setup_type("$dffe", {CLK, EN, D}, {Q}); + setup_type("$dffsr", {CLK, SET, CLR, D}, {Q}); + setup_type("$adff", {CLK, ARST, D}, {Q}); + setup_type("$dlatch", {EN, D}, {Q}); + setup_type("$dlatchsr", {EN, SET, CLR, D}, {Q}); + + setup_type("$memrd", {CLK, EN, ADDR}, {DATA}); + setup_type("$memwr", {CLK, EN, ADDR, DATA}, pool()); + setup_type("$meminit", {ADDR, DATA}, pool()); + setup_type("$mem", {RD_CLK, RD_EN, RD_ADDR, WR_CLK, WR_EN, WR_ADDR, WR_DATA}, {RD_DATA}); + + setup_type("$fsm", {CLK, ARST, CTRL_IN}, {CTRL_OUT}); + } + + void setup_stdcells() + { + IdString A = "\\A", B = "\\B", C = "\\C", D = "\\D"; + IdString E = "\\E", F = "\\F", G = "\\G", H = "\\H"; + IdString I = "\\I", J = "\\J", K = "\\K", L = "\\L"; + IdString M = "\\I", N = "\\N", O = "\\O", P = "\\P"; + IdString S = "\\S", T = "\\T", U = "\\U", V = "\\V"; + IdString Y = "\\Y"; + + setup_type("$_BUF_", {A}, {Y}, true); + setup_type("$_NOT_", {A}, {Y}, true); + setup_type("$_AND_", {A, B}, {Y}, true); + setup_type("$_NAND_", {A, B}, {Y}, true); + setup_type("$_OR_", {A, B}, {Y}, true); + setup_type("$_NOR_", {A, B}, {Y}, true); + setup_type("$_XOR_", {A, B}, {Y}, true); + setup_type("$_XNOR_", {A, B}, {Y}, true); + setup_type("$_MUX_", {A, B, S}, {Y}, true); + setup_type("$_MUX4_", {A, B, C, D, S, T}, {Y}, true); + setup_type("$_MUX8_", {A, B, C, D, E, F, G, H, S, T, U}, {Y}, true); + setup_type("$_MUX16_", {A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, S, T, U, V}, {Y}, true); + setup_type("$_AOI3_", {A, B, C}, {Y}, true); + setup_type("$_OAI3_", {A, B, C}, {Y}, true); + setup_type("$_AOI4_", {A, B, C, D}, {Y}, true); + setup_type("$_OAI4_", {A, B, C, D}, {Y}, true); + setup_type("$_TBUF_", {A, E}, {Y}, true); + } + + void setup_stdcells_mem() + { + IdString S = "\\S", R = "\\R", C = "\\C"; + IdString D = "\\D", Q = "\\Q", E = "\\E"; + + std::vector list_np = {'N', 'P'}, list_01 = {'0', '1'}; + + for (auto c1 : list_np) + for (auto c2 : list_np) + setup_type(stringf("$_SR_%c%c_", c1, c2), {S, R}, {Q}); + + setup_type("$_FF_", {D}, {Q}); + + for (auto c1 : list_np) + setup_type(stringf("$_DFF_%c_", c1), {C, D}, {Q}); + + for (auto c1 : list_np) + for (auto c2 : list_np) + setup_type(stringf("$_DFFE_%c%c_", c1, c2), {C, D, E}, {Q}); + + for (auto c1 : list_np) + for (auto c2 : list_np) + for (auto c3 : list_01) + setup_type(stringf("$_DFF_%c%c%c_", c1, c2, c3), {C, R, D}, {Q}); + + for (auto c1 : list_np) + for (auto c2 : list_np) + for (auto c3 : list_np) + setup_type(stringf("$_DFFSR_%c%c%c_", c1, c2, c3), {C, S, R, D}, {Q}); + + for (auto c1 : list_np) + setup_type(stringf("$_DLATCH_%c_", c1), {E, D}, {Q}); + + for (auto c1 : list_np) + for (auto c2 : list_np) + for (auto c3 : list_np) + setup_type(stringf("$_DLATCHSR_%c%c%c_", c1, c2, c3), {E, S, R, D}, {Q}); + } + + void clear() + { + cell_types.clear(); + } + + bool cell_known(RTLIL::IdString type) + { + return cell_types.count(type) != 0; + } + + bool cell_output(RTLIL::IdString type, RTLIL::IdString port) + { + auto it = cell_types.find(type); + return it != cell_types.end() && it->second.outputs.count(port) != 0; + } + + bool cell_input(RTLIL::IdString type, RTLIL::IdString port) + { + auto it = cell_types.find(type); + return it != cell_types.end() && it->second.inputs.count(port) != 0; + } + + bool cell_evaluable(RTLIL::IdString type) + { + auto it = cell_types.find(type); + return it != cell_types.end() && it->second.is_evaluable; + } + + static RTLIL::Const eval_not(RTLIL::Const v) + { + for (auto &bit : v.bits) + if (bit == RTLIL::S0) bit = RTLIL::S1; + else if (bit == RTLIL::S1) bit = RTLIL::S0; + return v; + } + + static RTLIL::Const eval(RTLIL::IdString type, const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len) + { + if (type == "$sshr" && !signed1) + type = "$shr"; + if (type == "$sshl" && !signed1) + type = "$shl"; + + if (type != "$sshr" && type != "$sshl" && type != "$shr" && type != "$shl" && type != "$shift" && type != "$shiftx" && + type != "$pos" && type != "$neg" && type != "$not") { + if (!signed1 || !signed2) + signed1 = false, signed2 = false; + } + +#define HANDLE_CELL_TYPE(_t) if (type == "$" #_t) return const_ ## _t(arg1, arg2, signed1, signed2, result_len); + HANDLE_CELL_TYPE(not) + HANDLE_CELL_TYPE(and) + HANDLE_CELL_TYPE(or) + HANDLE_CELL_TYPE(xor) + HANDLE_CELL_TYPE(xnor) + HANDLE_CELL_TYPE(reduce_and) + HANDLE_CELL_TYPE(reduce_or) + HANDLE_CELL_TYPE(reduce_xor) + HANDLE_CELL_TYPE(reduce_xnor) + HANDLE_CELL_TYPE(reduce_bool) + HANDLE_CELL_TYPE(logic_not) + HANDLE_CELL_TYPE(logic_and) + HANDLE_CELL_TYPE(logic_or) + HANDLE_CELL_TYPE(shl) + HANDLE_CELL_TYPE(shr) + HANDLE_CELL_TYPE(sshl) + HANDLE_CELL_TYPE(sshr) + HANDLE_CELL_TYPE(shift) + HANDLE_CELL_TYPE(shiftx) + HANDLE_CELL_TYPE(lt) + HANDLE_CELL_TYPE(le) + HANDLE_CELL_TYPE(eq) + HANDLE_CELL_TYPE(ne) + HANDLE_CELL_TYPE(eqx) + HANDLE_CELL_TYPE(nex) + HANDLE_CELL_TYPE(ge) + HANDLE_CELL_TYPE(gt) + HANDLE_CELL_TYPE(add) + HANDLE_CELL_TYPE(sub) + HANDLE_CELL_TYPE(mul) + HANDLE_CELL_TYPE(div) + HANDLE_CELL_TYPE(mod) + HANDLE_CELL_TYPE(pow) + HANDLE_CELL_TYPE(pos) + HANDLE_CELL_TYPE(neg) +#undef HANDLE_CELL_TYPE + + if (type == "$_BUF_") + return arg1; + if (type == "$_NOT_") + return eval_not(arg1); + if (type == "$_AND_") + return const_and(arg1, arg2, false, false, 1); + if (type == "$_NAND_") + return eval_not(const_and(arg1, arg2, false, false, 1)); + if (type == "$_OR_") + return const_or(arg1, arg2, false, false, 1); + if (type == "$_NOR_") + return eval_not(const_and(arg1, arg2, false, false, 1)); + if (type == "$_XOR_") + return const_xor(arg1, arg2, false, false, 1); + if (type == "$_XNOR_") + return const_xnor(arg1, arg2, false, false, 1); + + log_abort(); + } + + static RTLIL::Const eval(RTLIL::Cell *cell, const RTLIL::Const &arg1, const RTLIL::Const &arg2) + { + if (cell->type == "$slice") { + RTLIL::Const ret; + int width = cell->parameters.at("\\Y_WIDTH").as_int(); + int offset = cell->parameters.at("\\OFFSET").as_int(); + ret.bits.insert(ret.bits.end(), arg1.bits.begin()+offset, arg1.bits.begin()+offset+width); + return ret; + } + + if (cell->type == "$concat") { + RTLIL::Const ret = arg1; + ret.bits.insert(ret.bits.end(), arg2.bits.begin(), arg2.bits.end()); + return ret; + } + + if (cell->type == "$lut") + { + int width = cell->parameters.at("\\WIDTH").as_int(); + + std::vector t = cell->parameters.at("\\LUT").bits; + while (GetSize(t) < (1 << width)) + t.push_back(RTLIL::S0); + t.resize(1 << width); + + for (int i = width-1; i >= 0; i--) { + RTLIL::State sel = arg1.bits.at(i); + std::vector new_t; + if (sel == RTLIL::S0) + new_t = std::vector(t.begin(), t.begin() + GetSize(t)/2); + else if (sel == RTLIL::S1) + new_t = std::vector(t.begin() + GetSize(t)/2, t.end()); + else + for (int j = 0; j < GetSize(t)/2; j++) + new_t.push_back(t[j] == t[j + GetSize(t)/2] ? t[j] : RTLIL::Sx); + t.swap(new_t); + } + + log_assert(GetSize(t) == 1); + return t; + } + + if (cell->type == "$sop") + { + int width = cell->parameters.at("\\WIDTH").as_int(); + int depth = cell->parameters.at("\\DEPTH").as_int(); + std::vector t = cell->parameters.at("\\TABLE").bits; + + while (GetSize(t) < width*depth*2) + t.push_back(RTLIL::S0); + + RTLIL::State default_ret = State::S0; + + for (int i = 0; i < depth; i++) + { + bool match = true; + bool match_x = true; + + for (int j = 0; j < width; j++) { + RTLIL::State a = arg1.bits.at(j); + if (t.at(2*width*i + 2*j + 0) == State::S1) { + if (a == State::S1) match_x = false; + if (a != State::S0) match = false; + } + if (t.at(2*width*i + 2*j + 1) == State::S1) { + if (a == State::S0) match_x = false; + if (a != State::S1) match = false; + } + } + + if (match) + return State::S1; + + if (match_x) + default_ret = State::Sx; + } + + return default_ret; + } + + bool signed_a = cell->parameters.count("\\A_SIGNED") > 0 && cell->parameters["\\A_SIGNED"].as_bool(); + bool signed_b = cell->parameters.count("\\B_SIGNED") > 0 && cell->parameters["\\B_SIGNED"].as_bool(); + int result_len = cell->parameters.count("\\Y_WIDTH") > 0 ? cell->parameters["\\Y_WIDTH"].as_int() : -1; + return eval(cell->type, arg1, arg2, signed_a, signed_b, result_len); + } + + static RTLIL::Const eval(RTLIL::Cell *cell, const RTLIL::Const &arg1, const RTLIL::Const &arg2, const RTLIL::Const &arg3) + { + if (cell->type.in("$mux", "$pmux", "$_MUX_")) { + RTLIL::Const ret = arg1; + for (size_t i = 0; i < arg3.bits.size(); i++) + if (arg3.bits[i] == RTLIL::State::S1) { + std::vector bits(arg2.bits.begin() + i*arg1.bits.size(), arg2.bits.begin() + (i+1)*arg1.bits.size()); + ret = RTLIL::Const(bits); + } + return ret; + } + + if (cell->type == "$_AOI3_") + return eval_not(const_or(const_and(arg1, arg2, false, false, 1), arg3, false, false, 1)); + if (cell->type == "$_OAI3_") + return eval_not(const_and(const_or(arg1, arg2, false, false, 1), arg3, false, false, 1)); + + log_assert(arg3.bits.size() == 0); + return eval(cell, arg1, arg2); + } + + static RTLIL::Const eval(RTLIL::Cell *cell, const RTLIL::Const &arg1, const RTLIL::Const &arg2, const RTLIL::Const &arg3, const RTLIL::Const &arg4) + { + if (cell->type == "$_AOI4_") + return eval_not(const_or(const_and(arg1, arg2, false, false, 1), const_and(arg3, arg4, false, false, 1), false, false, 1)); + if (cell->type == "$_OAI4_") + return eval_not(const_and(const_or(arg1, arg2, false, false, 1), const_and(arg3, arg4, false, false, 1), false, false, 1)); + + log_assert(arg4.bits.size() == 0); + return eval(cell, arg1, arg2, arg3); + } +}; + +// initialized by yosys_setup() +extern CellTypes yosys_celltypes; + +YOSYS_NAMESPACE_END + +#endif + diff --git a/verilog/windows/autoyosys/share/include/kernel/consteval.h b/verilog/windows/autoyosys/share/include/kernel/consteval.h new file mode 100644 index 0000000..4d48b45 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/consteval.h @@ -0,0 +1,383 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef CONSTEVAL_H +#define CONSTEVAL_H + +#include "kernel/rtlil.h" +#include "kernel/sigtools.h" +#include "kernel/celltypes.h" +#include "kernel/macc.h" + +YOSYS_NAMESPACE_BEGIN + +struct ConstEval +{ + RTLIL::Module *module; + SigMap assign_map; + SigMap values_map; + SigPool stop_signals; + SigSet sig2driver; + std::set busy; + std::vector stack; + + ConstEval(RTLIL::Module *module) : module(module), assign_map(module) + { + CellTypes ct; + ct.setup_internals(); + ct.setup_stdcells(); + + for (auto &it : module->cells_) { + if (!ct.cell_known(it.second->type)) + continue; + for (auto &it2 : it.second->connections()) + if (ct.cell_output(it.second->type, it2.first)) + sig2driver.insert(assign_map(it2.second), it.second); + } + } + + void clear() + { + values_map.clear(); + stop_signals.clear(); + } + + void push() + { + stack.push_back(values_map); + } + + void pop() + { + values_map.swap(stack.back()); + stack.pop_back(); + } + + void set(RTLIL::SigSpec sig, RTLIL::Const value) + { + assign_map.apply(sig); +#ifndef NDEBUG + RTLIL::SigSpec current_val = values_map(sig); + for (int i = 0; i < GetSize(current_val); i++) + log_assert(current_val[i].wire != NULL || current_val[i] == value.bits[i]); +#endif + values_map.add(sig, RTLIL::SigSpec(value)); + } + + void stop(RTLIL::SigSpec sig) + { + assign_map.apply(sig); + stop_signals.add(sig); + } + + bool eval(RTLIL::Cell *cell, RTLIL::SigSpec &undef) + { + if (cell->type == "$lcu") + { + RTLIL::SigSpec sig_p = cell->getPort("\\P"); + RTLIL::SigSpec sig_g = cell->getPort("\\G"); + RTLIL::SigSpec sig_ci = cell->getPort("\\CI"); + RTLIL::SigSpec sig_co = values_map(assign_map(cell->getPort("\\CO"))); + + if (sig_co.is_fully_const()) + return true; + + if (!eval(sig_p, undef, cell)) + return false; + + if (!eval(sig_g, undef, cell)) + return false; + + if (!eval(sig_ci, undef, cell)) + return false; + + if (sig_p.is_fully_def() && sig_g.is_fully_def() && sig_ci.is_fully_def()) + { + RTLIL::Const coval(RTLIL::Sx, GetSize(sig_co)); + bool carry = sig_ci.as_bool(); + + for (int i = 0; i < GetSize(coval); i++) { + carry = (sig_g[i] == RTLIL::S1) || (sig_p[i] == RTLIL::S1 && carry); + coval.bits[i] = carry ? RTLIL::S1 : RTLIL::S0; + } + + set(sig_co, coval); + } + else + set(sig_co, RTLIL::Const(RTLIL::Sx, GetSize(sig_co))); + + return true; + } + + RTLIL::SigSpec sig_a, sig_b, sig_s, sig_y; + + log_assert(cell->hasPort("\\Y")); + sig_y = values_map(assign_map(cell->getPort("\\Y"))); + if (sig_y.is_fully_const()) + return true; + + if (cell->hasPort("\\S")) { + sig_s = cell->getPort("\\S"); + if (!eval(sig_s, undef, cell)) + return false; + } + + if (cell->hasPort("\\A")) + sig_a = cell->getPort("\\A"); + + if (cell->hasPort("\\B")) + sig_b = cell->getPort("\\B"); + + if (cell->type == "$mux" || cell->type == "$pmux" || cell->type == "$_MUX_") + { + std::vector y_candidates; + int count_maybe_set_s_bits = 0; + int count_set_s_bits = 0; + + for (int i = 0; i < sig_s.size(); i++) + { + RTLIL::State s_bit = sig_s.extract(i, 1).as_const().bits.at(0); + RTLIL::SigSpec b_slice = sig_b.extract(sig_y.size()*i, sig_y.size()); + + if (s_bit == RTLIL::State::Sx || s_bit == RTLIL::State::S1) + y_candidates.push_back(b_slice); + + if (s_bit == RTLIL::State::S1 || s_bit == RTLIL::State::Sx) + count_maybe_set_s_bits++; + + if (s_bit == RTLIL::State::S1) + count_set_s_bits++; + } + + if (count_set_s_bits == 0) + y_candidates.push_back(sig_a); + + std::vector y_values; + + log_assert(y_candidates.size() > 0); + for (auto &yc : y_candidates) { + if (!eval(yc, undef, cell)) + return false; + y_values.push_back(yc.as_const()); + } + + if (y_values.size() > 1) + { + std::vector master_bits = y_values.at(0).bits; + + for (size_t i = 1; i < y_values.size(); i++) { + std::vector &slave_bits = y_values.at(i).bits; + log_assert(master_bits.size() == slave_bits.size()); + for (size_t j = 0; j < master_bits.size(); j++) + if (master_bits[j] != slave_bits[j]) + master_bits[j] = RTLIL::State::Sx; + } + + set(sig_y, RTLIL::Const(master_bits)); + } + else + set(sig_y, y_values.front()); + } + else if (cell->type == "$fa") + { + RTLIL::SigSpec sig_c = cell->getPort("\\C"); + RTLIL::SigSpec sig_x = cell->getPort("\\X"); + int width = GetSize(sig_c); + + if (!eval(sig_a, undef, cell)) + return false; + + if (!eval(sig_b, undef, cell)) + return false; + + if (!eval(sig_c, undef, cell)) + return false; + + RTLIL::Const t1 = const_xor(sig_a.as_const(), sig_b.as_const(), false, false, width); + RTLIL::Const val_y = const_xor(t1, sig_c.as_const(), false, false, width); + + RTLIL::Const t2 = const_and(sig_a.as_const(), sig_b.as_const(), false, false, width); + RTLIL::Const t3 = const_and(sig_c.as_const(), t1, false, false, width); + RTLIL::Const val_x = const_or(t2, t3, false, false, width); + + for (int i = 0; i < GetSize(val_y); i++) + if (val_y.bits[i] == RTLIL::Sx) + val_x.bits[i] = RTLIL::Sx; + + set(sig_y, val_y); + set(sig_x, val_x); + } + else if (cell->type == "$alu") + { + bool signed_a = cell->parameters.count("\\A_SIGNED") > 0 && cell->parameters["\\A_SIGNED"].as_bool(); + bool signed_b = cell->parameters.count("\\B_SIGNED") > 0 && cell->parameters["\\B_SIGNED"].as_bool(); + + RTLIL::SigSpec sig_ci = cell->getPort("\\CI"); + RTLIL::SigSpec sig_bi = cell->getPort("\\BI"); + + if (!eval(sig_a, undef, cell)) + return false; + + if (!eval(sig_b, undef, cell)) + return false; + + if (!eval(sig_ci, undef, cell)) + return false; + + if (!eval(sig_bi, undef, cell)) + return false; + + RTLIL::SigSpec sig_x = cell->getPort("\\X"); + RTLIL::SigSpec sig_co = cell->getPort("\\CO"); + + bool any_input_undef = !(sig_a.is_fully_def() && sig_b.is_fully_def() && sig_ci.is_fully_def() && sig_bi.is_fully_def()); + sig_a.extend_u0(GetSize(sig_y), signed_a); + sig_b.extend_u0(GetSize(sig_y), signed_b); + + bool carry = sig_ci[0] == RTLIL::S1; + bool b_inv = sig_bi[0] == RTLIL::S1; + + for (int i = 0; i < GetSize(sig_y); i++) + { + RTLIL::SigSpec x_inputs = { sig_a[i], sig_b[i], sig_bi[0] }; + + if (!x_inputs.is_fully_def()) { + set(sig_x[i], RTLIL::Sx); + } else { + bool bit_a = sig_a[i] == RTLIL::S1; + bool bit_b = (sig_b[i] == RTLIL::S1) != b_inv; + bool bit_x = bit_a != bit_b; + set(sig_x[i], bit_x ? RTLIL::S1 : RTLIL::S0); + } + + if (any_input_undef) { + set(sig_y[i], RTLIL::Sx); + set(sig_co[i], RTLIL::Sx); + } else { + bool bit_a = sig_a[i] == RTLIL::S1; + bool bit_b = (sig_b[i] == RTLIL::S1) != b_inv; + bool bit_y = (bit_a != bit_b) != carry; + carry = (bit_a && bit_b) || (bit_a && carry) || (bit_b && carry); + set(sig_y[i], bit_y ? RTLIL::S1 : RTLIL::S0); + set(sig_co[i], carry ? RTLIL::S1 : RTLIL::S0); + } + } + } + else if (cell->type == "$macc") + { + Macc macc; + macc.from_cell(cell); + + if (!eval(macc.bit_ports, undef, cell)) + return false; + + for (auto &port : macc.ports) { + if (!eval(port.in_a, undef, cell)) + return false; + if (!eval(port.in_b, undef, cell)) + return false; + } + + RTLIL::Const result(0, GetSize(cell->getPort("\\Y"))); + if (!macc.eval(result)) + log_abort(); + + set(cell->getPort("\\Y"), result); + } + else + { + RTLIL::SigSpec sig_c, sig_d; + + if (cell->type.in("$_AOI3_", "$_OAI3_", "$_AOI4_", "$_OAI4_")) { + if (cell->hasPort("\\C")) + sig_c = cell->getPort("\\C"); + if (cell->hasPort("\\D")) + sig_d = cell->getPort("\\D"); + } + + if (sig_a.size() > 0 && !eval(sig_a, undef, cell)) + return false; + if (sig_b.size() > 0 && !eval(sig_b, undef, cell)) + return false; + if (sig_c.size() > 0 && !eval(sig_c, undef, cell)) + return false; + if (sig_d.size() > 0 && !eval(sig_d, undef, cell)) + return false; + + set(sig_y, CellTypes::eval(cell, sig_a.as_const(), sig_b.as_const(), + sig_c.as_const(), sig_d.as_const())); + } + + return true; + } + + bool eval(RTLIL::SigSpec &sig, RTLIL::SigSpec &undef, RTLIL::Cell *busy_cell = NULL) + { + assign_map.apply(sig); + values_map.apply(sig); + + if (sig.is_fully_const()) + return true; + + if (stop_signals.check_any(sig)) { + undef = stop_signals.extract(sig); + return false; + } + + if (busy_cell) { + if (busy.count(busy_cell) > 0) { + undef = sig; + return false; + } + busy.insert(busy_cell); + } + + std::set driver_cells; + sig2driver.find(sig, driver_cells); + for (auto cell : driver_cells) { + if (!eval(cell, undef)) { + if (busy_cell) + busy.erase(busy_cell); + return false; + } + } + + if (busy_cell) + busy.erase(busy_cell); + + values_map.apply(sig); + if (sig.is_fully_const()) + return true; + + for (auto &c : sig.chunks()) + if (c.wire != NULL) + undef.append(c); + return false; + } + + bool eval(RTLIL::SigSpec &sig) + { + RTLIL::SigSpec undef; + return eval(sig, undef); + } +}; + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/hashlib.h b/verilog/windows/autoyosys/share/include/kernel/hashlib.h new file mode 100644 index 0000000..3c824b8 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/hashlib.h @@ -0,0 +1,1052 @@ +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. + +// ------------------------------------------------------- +// Written by Clifford Wolf in 2014 +// ------------------------------------------------------- + +#ifndef HASHLIB_H +#define HASHLIB_H + +#include +#include +#include +#include + +namespace hashlib { + +const int hashtable_size_trigger = 2; +const int hashtable_size_factor = 3; + +// The XOR version of DJB2 +inline unsigned int mkhash(unsigned int a, unsigned int b) { + return ((a << 5) + a) ^ b; +} + +// traditionally 5381 is used as starting value for the djb2 hash +const unsigned int mkhash_init = 5381; + +// The ADD version of DJB2 +// (use this version for cache locality in b) +inline unsigned int mkhash_add(unsigned int a, unsigned int b) { + return ((a << 5) + a) + b; +} + +inline unsigned int mkhash_xorshift(unsigned int a) { + if (sizeof(a) == 4) { + a ^= a << 13; + a ^= a >> 17; + a ^= a << 5; + } else if (sizeof(a) == 8) { + a ^= a << 13; + a ^= a >> 7; + a ^= a << 17; + } else + throw std::runtime_error("mkhash_xorshift() only implemented for 32 bit and 64 bit ints"); + return a; +} + +template struct hash_ops { + static inline bool cmp(const T &a, const T &b) { + return a == b; + } + static inline unsigned int hash(const T &a) { + return a.hash(); + } +}; + +struct hash_int_ops { + template + static inline bool cmp(T a, T b) { + return a == b; + } +}; + +template<> struct hash_ops : hash_int_ops +{ + static inline unsigned int hash(int32_t a) { + return a; + } +}; +template<> struct hash_ops : hash_int_ops +{ + static inline unsigned int hash(int64_t a) { + return mkhash((unsigned int)(a), (unsigned int)(a >> 32)); + } +}; + +template<> struct hash_ops { + static inline bool cmp(const std::string &a, const std::string &b) { + return a == b; + } + static inline unsigned int hash(const std::string &a) { + unsigned int v = 0; + for (auto c : a) + v = mkhash(v, c); + return v; + } +}; + +template struct hash_ops> { + static inline bool cmp(std::pair a, std::pair b) { + return a == b; + } + static inline unsigned int hash(std::pair a) { + return mkhash(hash_ops

::hash(a.first), hash_ops::hash(a.second)); + } +}; + +template struct hash_ops> { + static inline bool cmp(std::tuple a, std::tuple b) { + return a == b; + } + template + static inline typename std::enable_if::type hash(std::tuple) { + return mkhash_init; + } + template + static inline typename std::enable_if::type hash(std::tuple a) { + typedef hash_ops>::type> element_ops_t; + return mkhash(hash(a), element_ops_t::hash(std::get(a))); + } +}; + +template struct hash_ops> { + static inline bool cmp(std::vector a, std::vector b) { + return a == b; + } + static inline unsigned int hash(std::vector a) { + unsigned int h = mkhash_init; + for (auto k : a) + h = mkhash(h, hash_ops::hash(k)); + return h; + } +}; + +struct hash_cstr_ops { + static inline bool cmp(const char *a, const char *b) { + for (int i = 0; a[i] || b[i]; i++) + if (a[i] != b[i]) + return false; + return true; + } + static inline unsigned int hash(const char *a) { + unsigned int hash = mkhash_init; + while (*a) + hash = mkhash(hash, *(a++)); + return hash; + } +}; + +struct hash_ptr_ops { + static inline bool cmp(const void *a, const void *b) { + return a == b; + } + static inline unsigned int hash(const void *a) { + return (unsigned long)a; + } +}; + +struct hash_obj_ops { + static inline bool cmp(const void *a, const void *b) { + return a == b; + } + template + static inline unsigned int hash(const T *a) { + return a ? a->hash() : 0; + } +}; + +template +inline unsigned int mkhash(const T &v) { + return hash_ops().hash(v); +} + +inline int hashtable_size(int min_size) +{ + static std::vector zero_and_some_primes = { + 0, 23, 29, 37, 47, 59, 79, 101, 127, 163, 211, 269, 337, 431, 541, 677, + 853, 1069, 1361, 1709, 2137, 2677, 3347, 4201, 5261, 6577, 8231, 10289, + 12889, 16127, 20161, 25219, 31531, 39419, 49277, 61603, 77017, 96281, + 120371, 150473, 188107, 235159, 293957, 367453, 459317, 574157, 717697, + 897133, 1121423, 1401791, 1752239, 2190299, 2737937, 3422429, 4278037, + 5347553, 6684443, 8355563, 10444457, 13055587, 16319519, 20399411, + 25499291, 31874149, 39842687, 49803361, 62254207, 77817767, 97272239, + 121590311, 151987889, 189984863, 237481091, 296851369, 371064217 + }; + + for (auto p : zero_and_some_primes) + if (p >= min_size) return p; + + if (sizeof(int) == 4) + throw std::length_error("hash table exceeded maximum size. use a ILP64 abi for larger tables."); + + for (auto p : zero_and_some_primes) + if (100129 * p > min_size) return 100129 * p; + + throw std::length_error("hash table exceeded maximum size."); +} + +template> class dict; +template> class idict; +template> class pool; +template> class mfp; + +template +class dict +{ + struct entry_t + { + std::pair udata; + int next; + + entry_t() { } + entry_t(const std::pair &udata, int next) : udata(udata), next(next) { } + entry_t(std::pair &&udata, int next) : udata(std::move(udata)), next(next) { } + }; + + std::vector hashtable; + std::vector entries; + OPS ops; + +#ifdef NDEBUG + static inline void do_assert(bool) { } +#else + static inline void do_assert(bool cond) { + if (!cond) throw std::runtime_error("dict<> assert failed."); + } +#endif + + int do_hash(const K &key) const + { + unsigned int hash = 0; + if (!hashtable.empty()) + hash = ops.hash(key) % (unsigned int)(hashtable.size()); + return hash; + } + + void do_rehash() + { + hashtable.clear(); + hashtable.resize(hashtable_size(entries.capacity() * hashtable_size_factor), -1); + + for (int i = 0; i < int(entries.size()); i++) { + do_assert(-1 <= entries[i].next && entries[i].next < int(entries.size())); + int hash = do_hash(entries[i].udata.first); + entries[i].next = hashtable[hash]; + hashtable[hash] = i; + } + } + + int do_erase(int index, int hash) + { + do_assert(index < int(entries.size())); + if (hashtable.empty() || index < 0) + return 0; + + int k = hashtable[hash]; + do_assert(0 <= k && k < int(entries.size())); + + if (k == index) { + hashtable[hash] = entries[index].next; + } else { + while (entries[k].next != index) { + k = entries[k].next; + do_assert(0 <= k && k < int(entries.size())); + } + entries[k].next = entries[index].next; + } + + int back_idx = entries.size()-1; + + if (index != back_idx) + { + int back_hash = do_hash(entries[back_idx].udata.first); + + k = hashtable[back_hash]; + do_assert(0 <= k && k < int(entries.size())); + + if (k == back_idx) { + hashtable[back_hash] = index; + } else { + while (entries[k].next != back_idx) { + k = entries[k].next; + do_assert(0 <= k && k < int(entries.size())); + } + entries[k].next = index; + } + + entries[index] = std::move(entries[back_idx]); + } + + entries.pop_back(); + + if (entries.empty()) + hashtable.clear(); + + return 1; + } + + int do_lookup(const K &key, int &hash) const + { + if (hashtable.empty()) + return -1; + + if (entries.size() * hashtable_size_trigger > hashtable.size()) { + ((dict*)this)->do_rehash(); + hash = do_hash(key); + } + + int index = hashtable[hash]; + + while (index >= 0 && !ops.cmp(entries[index].udata.first, key)) { + index = entries[index].next; + do_assert(-1 <= index && index < int(entries.size())); + } + + return index; + } + + int do_insert(const K &key, int &hash) + { + if (hashtable.empty()) { + entries.push_back(entry_t(std::pair(key, T()), -1)); + do_rehash(); + hash = do_hash(key); + } else { + entries.push_back(entry_t(std::pair(key, T()), hashtable[hash])); + hashtable[hash] = entries.size() - 1; + } + return entries.size() - 1; + } + + int do_insert(const std::pair &value, int &hash) + { + if (hashtable.empty()) { + entries.push_back(entry_t(value, -1)); + do_rehash(); + hash = do_hash(value.first); + } else { + entries.push_back(entry_t(value, hashtable[hash])); + hashtable[hash] = entries.size() - 1; + } + return entries.size() - 1; + } + +public: + class const_iterator : public std::iterator> + { + friend class dict; + protected: + const dict *ptr; + int index; + const_iterator(const dict *ptr, int index) : ptr(ptr), index(index) { } + public: + const_iterator() { } + const_iterator operator++() { index--; return *this; } + bool operator<(const const_iterator &other) const { return index > other.index; } + bool operator==(const const_iterator &other) const { return index == other.index; } + bool operator!=(const const_iterator &other) const { return index != other.index; } + const std::pair &operator*() const { return ptr->entries[index].udata; } + const std::pair *operator->() const { return &ptr->entries[index].udata; } + }; + + class iterator : public std::iterator> + { + friend class dict; + protected: + dict *ptr; + int index; + iterator(dict *ptr, int index) : ptr(ptr), index(index) { } + public: + iterator() { } + iterator operator++() { index--; return *this; } + bool operator<(const iterator &other) const { return index > other.index; } + bool operator==(const iterator &other) const { return index == other.index; } + bool operator!=(const iterator &other) const { return index != other.index; } + std::pair &operator*() { return ptr->entries[index].udata; } + std::pair *operator->() { return &ptr->entries[index].udata; } + const std::pair &operator*() const { return ptr->entries[index].udata; } + const std::pair *operator->() const { return &ptr->entries[index].udata; } + operator const_iterator() const { return const_iterator(ptr, index); } + }; + + dict() + { + } + + dict(const dict &other) + { + entries = other.entries; + do_rehash(); + } + + dict(dict &&other) + { + swap(other); + } + + dict &operator=(const dict &other) { + entries = other.entries; + do_rehash(); + return *this; + } + + dict &operator=(dict &&other) { + clear(); + swap(other); + return *this; + } + + dict(const std::initializer_list> &list) + { + for (auto &it : list) + insert(it); + } + + template + dict(InputIterator first, InputIterator last) + { + insert(first, last); + } + + template + void insert(InputIterator first, InputIterator last) + { + for (; first != last; ++first) + insert(*first); + } + + std::pair insert(const K &key) + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + if (i >= 0) + return std::pair(iterator(this, i), false); + i = do_insert(key, hash); + return std::pair(iterator(this, i), true); + } + + std::pair insert(const std::pair &value) + { + int hash = do_hash(value.first); + int i = do_lookup(value.first, hash); + if (i >= 0) + return std::pair(iterator(this, i), false); + i = do_insert(value, hash); + return std::pair(iterator(this, i), true); + } + + int erase(const K &key) + { + int hash = do_hash(key); + int index = do_lookup(key, hash); + return do_erase(index, hash); + } + + iterator erase(iterator it) + { + int hash = do_hash(it->first); + do_erase(it.index, hash); + return ++it; + } + + int count(const K &key) const + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + return i < 0 ? 0 : 1; + } + + int count(const K &key, const_iterator it) const + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + return i < 0 || i > it.index ? 0 : 1; + } + + iterator find(const K &key) + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + if (i < 0) + return end(); + return iterator(this, i); + } + + const_iterator find(const K &key) const + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + if (i < 0) + return end(); + return const_iterator(this, i); + } + + T& at(const K &key) + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + if (i < 0) + throw std::out_of_range("dict::at()"); + return entries[i].udata.second; + } + + const T& at(const K &key) const + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + if (i < 0) + throw std::out_of_range("dict::at()"); + return entries[i].udata.second; + } + + T at(const K &key, const T &defval) const + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + if (i < 0) + return defval; + return entries[i].udata.second; + } + + T& operator[](const K &key) + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + if (i < 0) + i = do_insert(std::pair(key, T()), hash); + return entries[i].udata.second; + } + + template> + void sort(Compare comp = Compare()) + { + std::sort(entries.begin(), entries.end(), [comp](const entry_t &a, const entry_t &b){ return comp(b.udata.first, a.udata.first); }); + do_rehash(); + } + + void swap(dict &other) + { + hashtable.swap(other.hashtable); + entries.swap(other.entries); + } + + bool operator==(const dict &other) const { + if (size() != other.size()) + return false; + for (auto &it : entries) { + auto oit = other.find(it.udata.first); + if (oit == other.end() || !(oit->second == it.udata.second)) + return false; + } + return true; + } + + bool operator!=(const dict &other) const { + return !operator==(other); + } + + void reserve(size_t n) { entries.reserve(n); } + size_t size() const { return entries.size(); } + bool empty() const { return entries.empty(); } + void clear() { hashtable.clear(); entries.clear(); } + + iterator begin() { return iterator(this, int(entries.size())-1); } + iterator end() { return iterator(nullptr, -1); } + + const_iterator begin() const { return const_iterator(this, int(entries.size())-1); } + const_iterator end() const { return const_iterator(nullptr, -1); } +}; + +template +class pool +{ + template friend class idict; + +protected: + struct entry_t + { + K udata; + int next; + + entry_t() { } + entry_t(const K &udata, int next) : udata(udata), next(next) { } + }; + + std::vector hashtable; + std::vector entries; + OPS ops; + +#ifdef NDEBUG + static inline void do_assert(bool) { } +#else + static inline void do_assert(bool cond) { + if (!cond) throw std::runtime_error("pool<> assert failed."); + } +#endif + + int do_hash(const K &key) const + { + unsigned int hash = 0; + if (!hashtable.empty()) + hash = ops.hash(key) % (unsigned int)(hashtable.size()); + return hash; + } + + void do_rehash() + { + hashtable.clear(); + hashtable.resize(hashtable_size(entries.capacity() * hashtable_size_factor), -1); + + for (int i = 0; i < int(entries.size()); i++) { + do_assert(-1 <= entries[i].next && entries[i].next < int(entries.size())); + int hash = do_hash(entries[i].udata); + entries[i].next = hashtable[hash]; + hashtable[hash] = i; + } + } + + int do_erase(int index, int hash) + { + do_assert(index < int(entries.size())); + if (hashtable.empty() || index < 0) + return 0; + + int k = hashtable[hash]; + if (k == index) { + hashtable[hash] = entries[index].next; + } else { + while (entries[k].next != index) { + k = entries[k].next; + do_assert(0 <= k && k < int(entries.size())); + } + entries[k].next = entries[index].next; + } + + int back_idx = entries.size()-1; + + if (index != back_idx) + { + int back_hash = do_hash(entries[back_idx].udata); + + k = hashtable[back_hash]; + if (k == back_idx) { + hashtable[back_hash] = index; + } else { + while (entries[k].next != back_idx) { + k = entries[k].next; + do_assert(0 <= k && k < int(entries.size())); + } + entries[k].next = index; + } + + entries[index] = std::move(entries[back_idx]); + } + + entries.pop_back(); + + if (entries.empty()) + hashtable.clear(); + + return 1; + } + + int do_lookup(const K &key, int &hash) const + { + if (hashtable.empty()) + return -1; + + if (entries.size() * hashtable_size_trigger > hashtable.size()) { + ((pool*)this)->do_rehash(); + hash = do_hash(key); + } + + int index = hashtable[hash]; + + while (index >= 0 && !ops.cmp(entries[index].udata, key)) { + index = entries[index].next; + do_assert(-1 <= index && index < int(entries.size())); + } + + return index; + } + + int do_insert(const K &value, int &hash) + { + if (hashtable.empty()) { + entries.push_back(entry_t(value, -1)); + do_rehash(); + hash = do_hash(value); + } else { + entries.push_back(entry_t(value, hashtable[hash])); + hashtable[hash] = entries.size() - 1; + } + return entries.size() - 1; + } + +public: + class const_iterator : public std::iterator + { + friend class pool; + protected: + const pool *ptr; + int index; + const_iterator(const pool *ptr, int index) : ptr(ptr), index(index) { } + public: + const_iterator() { } + const_iterator operator++() { index--; return *this; } + bool operator==(const const_iterator &other) const { return index == other.index; } + bool operator!=(const const_iterator &other) const { return index != other.index; } + const K &operator*() const { return ptr->entries[index].udata; } + const K *operator->() const { return &ptr->entries[index].udata; } + }; + + class iterator : public std::iterator + { + friend class pool; + protected: + pool *ptr; + int index; + iterator(pool *ptr, int index) : ptr(ptr), index(index) { } + public: + iterator() { } + iterator operator++() { index--; return *this; } + bool operator==(const iterator &other) const { return index == other.index; } + bool operator!=(const iterator &other) const { return index != other.index; } + K &operator*() { return ptr->entries[index].udata; } + K *operator->() { return &ptr->entries[index].udata; } + const K &operator*() const { return ptr->entries[index].udata; } + const K *operator->() const { return &ptr->entries[index].udata; } + operator const_iterator() const { return const_iterator(ptr, index); } + }; + + pool() + { + } + + pool(const pool &other) + { + entries = other.entries; + do_rehash(); + } + + pool(pool &&other) + { + swap(other); + } + + pool &operator=(const pool &other) { + entries = other.entries; + do_rehash(); + return *this; + } + + pool &operator=(pool &&other) { + clear(); + swap(other); + return *this; + } + + pool(const std::initializer_list &list) + { + for (auto &it : list) + insert(it); + } + + template + pool(InputIterator first, InputIterator last) + { + insert(first, last); + } + + template + void insert(InputIterator first, InputIterator last) + { + for (; first != last; ++first) + insert(*first); + } + + std::pair insert(const K &value) + { + int hash = do_hash(value); + int i = do_lookup(value, hash); + if (i >= 0) + return std::pair(iterator(this, i), false); + i = do_insert(value, hash); + return std::pair(iterator(this, i), true); + } + + int erase(const K &key) + { + int hash = do_hash(key); + int index = do_lookup(key, hash); + return do_erase(index, hash); + } + + iterator erase(iterator it) + { + int hash = do_hash(*it); + do_erase(it.index, hash); + return ++it; + } + + int count(const K &key) const + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + return i < 0 ? 0 : 1; + } + + int count(const K &key, const_iterator it) const + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + return i < 0 || i > it.index ? 0 : 1; + } + + iterator find(const K &key) + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + if (i < 0) + return end(); + return iterator(this, i); + } + + const_iterator find(const K &key) const + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + if (i < 0) + return end(); + return const_iterator(this, i); + } + + bool operator[](const K &key) + { + int hash = do_hash(key); + int i = do_lookup(key, hash); + return i >= 0; + } + + template> + void sort(Compare comp = Compare()) + { + std::sort(entries.begin(), entries.end(), [comp](const entry_t &a, const entry_t &b){ return comp(b.udata, a.udata); }); + do_rehash(); + } + + K pop() + { + iterator it = begin(); + K ret = *it; + erase(it); + return ret; + } + + void swap(pool &other) + { + hashtable.swap(other.hashtable); + entries.swap(other.entries); + } + + bool operator==(const pool &other) const { + if (size() != other.size()) + return false; + for (auto &it : entries) + if (!other.count(it.udata)) + return false; + return true; + } + + bool operator!=(const pool &other) const { + return !operator==(other); + } + + void reserve(size_t n) { entries.reserve(n); } + size_t size() const { return entries.size(); } + bool empty() const { return entries.empty(); } + void clear() { hashtable.clear(); entries.clear(); } + + iterator begin() { return iterator(this, int(entries.size())-1); } + iterator end() { return iterator(nullptr, -1); } + + const_iterator begin() const { return const_iterator(this, int(entries.size())-1); } + const_iterator end() const { return const_iterator(nullptr, -1); } +}; + +template +class idict +{ + pool database; + +public: + typedef typename pool::const_iterator const_iterator; + + int operator()(const K &key) + { + int hash = database.do_hash(key); + int i = database.do_lookup(key, hash); + if (i < 0) + i = database.do_insert(key, hash); + return i + offset; + } + + int at(const K &key) const + { + int hash = database.do_hash(key); + int i = database.do_lookup(key, hash); + if (i < 0) + throw std::out_of_range("idict::at()"); + return i + offset; + } + + int at(const K &key, int defval) const + { + int hash = database.do_hash(key); + int i = database.do_lookup(key, hash); + if (i < 0) + return defval; + return i + offset; + } + + int count(const K &key) const + { + int hash = database.do_hash(key); + int i = database.do_lookup(key, hash); + return i < 0 ? 0 : 1; + } + + void expect(const K &key, int i) + { + int j = (*this)(key); + if (i != j) + throw std::out_of_range("idict::expect()"); + } + + const K &operator[](int index) const + { + return database.entries.at(index - offset).udata; + } + + void swap(idict &other) + { + database.swap(other.database); + } + + void reserve(size_t n) { database.reserve(n); } + size_t size() const { return database.size(); } + bool empty() const { return database.empty(); } + void clear() { database.clear(); } + + const_iterator begin() const { return database.begin(); } + const_iterator end() const { return database.end(); } +}; + +template +class mfp +{ + mutable idict database; + mutable std::vector parents; + +public: + typedef typename idict::const_iterator const_iterator; + + int operator()(const K &key) const + { + int i = database(key); + parents.resize(database.size(), -1); + return i; + } + + const K &operator[](int index) const + { + return database[index]; + } + + int ifind(int i) const + { + int p = i, k = i; + + while (parents[p] != -1) + p = parents[p]; + + while (k != p) { + int next_k = parents[k]; + parents[k] = p; + k = next_k; + } + + return p; + } + + void imerge(int i, int j) + { + i = ifind(i); + j = ifind(j); + + if (i != j) + parents[i] = j; + } + + void ipromote(int i) + { + int k = i; + + while (k != -1) { + int next_k = parents[k]; + parents[k] = i; + k = next_k; + } + + parents[i] = -1; + } + + int lookup(const K &a) const + { + return ifind((*this)(a)); + } + + const K &find(const K &a) const + { + int i = database.at(a, -1); + if (i < 0) + return a; + return (*this)[ifind(i)]; + } + + void merge(const K &a, const K &b) + { + imerge((*this)(a), (*this)(b)); + } + + void promote(const K &a) + { + int i = database.at(a, -1); + if (i >= 0) + ipromote(i); + } + + void swap(mfp &other) + { + database.swap(other.database); + parents.swap(other.parents); + } + + void reserve(size_t n) { database.reserve(n); } + size_t size() const { return database.size(); } + bool empty() const { return database.empty(); } + void clear() { database.clear(); parents.clear(); } + + const_iterator begin() const { return database.begin(); } + const_iterator end() const { return database.end(); } +}; + +} /* namespace hashlib */ + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/log.h b/verilog/windows/autoyosys/share/include/kernel/log.h new file mode 100644 index 0000000..53480db --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/log.h @@ -0,0 +1,308 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include "kernel/yosys.h" + +#ifndef LOG_H +#define LOG_H + +#include + +#ifndef _WIN32 +# include +# include +#endif + +#if defined(_MSC_VER) +// At least this is not in MSVC++ 2013. +# define __PRETTY_FUNCTION__ __FUNCTION__ +#endif + +// from libs/sha1/sha1.h +class SHA1; + +YOSYS_NAMESPACE_BEGIN + +#define S__LINE__sub2(x) #x +#define S__LINE__sub1(x) S__LINE__sub2(x) +#define S__LINE__ S__LINE__sub1(__LINE__) + +struct log_cmd_error_exception { }; + +extern std::vector log_files; +extern std::vector log_streams; +extern std::map> log_hdump; +extern bool log_hdump_all; +extern FILE *log_errfile; +extern SHA1 *log_hasher; + +extern bool log_time; +extern bool log_error_stderr; +extern bool log_cmd_error_throw; +extern bool log_quiet_warnings; +extern int log_verbose_level; +extern string log_last_error; + +void logv(const char *format, va_list ap); +void logv_header(RTLIL::Design *design, const char *format, va_list ap); +void logv_warning(const char *format, va_list ap); +YS_NORETURN void logv_error(const char *format, va_list ap) YS_ATTRIBUTE(noreturn); + +void log(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2)); +void log_header(RTLIL::Design *design, const char *format, ...) YS_ATTRIBUTE(format(printf, 2, 3)); +void log_warning(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2)); +YS_NORETURN void log_error(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2), noreturn); +YS_NORETURN void log_cmd_error(const char *format, ...) YS_ATTRIBUTE(format(printf, 1, 2), noreturn); + +void log_spacer(); +void log_push(); +void log_pop(); + +void log_backtrace(const char *prefix, int levels); +void log_reset_stack(); +void log_flush(); + +const char *log_signal(const RTLIL::SigSpec &sig, bool autoint = true); +const char *log_const(const RTLIL::Const &value, bool autoint = true); +const char *log_id(RTLIL::IdString id); + +template static inline const char *log_id(T *obj) { + return log_id(obj->name); +} + +void log_module(RTLIL::Module *module, std::string indent = ""); +void log_cell(RTLIL::Cell *cell, std::string indent = ""); + +#ifndef NDEBUG +static inline void log_assert_worker(bool cond, const char *expr, const char *file, int line) { + if (!cond) log_error("Assert `%s' failed in %s:%d.\n", expr, file, line); +} +# define log_assert(_assert_expr_) YOSYS_NAMESPACE_PREFIX log_assert_worker(_assert_expr_, #_assert_expr_, __FILE__, __LINE__) +#else +# define log_assert(_assert_expr_) +#endif + +#define log_abort() YOSYS_NAMESPACE_PREFIX log_error("Abort in %s:%d.\n", __FILE__, __LINE__) +#define log_ping() YOSYS_NAMESPACE_PREFIX log("-- %s:%d %s --\n", __FILE__, __LINE__, __PRETTY_FUNCTION__) + + +// --------------------------------------------------- +// This is the magic behind the code coverage counters +// --------------------------------------------------- + +#if defined(YOSYS_ENABLE_COVER) && defined(__linux__) + +#define cover(_id) do { \ + static CoverData __d __attribute__((section("yosys_cover_list"), aligned(1), used)) = { __FILE__, __FUNCTION__, _id, __LINE__, 0 }; \ + __d.counter++; \ +} while (0) + +struct CoverData { + const char *file, *func, *id; + int line, counter; +} YS_ATTRIBUTE(packed); + +// this two symbols are created by the linker for the "yosys_cover_list" ELF section +extern "C" struct CoverData __start_yosys_cover_list[]; +extern "C" struct CoverData __stop_yosys_cover_list[]; + +extern dict> extra_coverage_data; + +void cover_extra(std::string parent, std::string id, bool increment = true); +dict> get_coverage_data(); + +#define cover_list(_id, ...) do { cover(_id); \ + std::string r = cover_list_worker(_id, __VA_ARGS__); \ + log_assert(r.empty()); \ +} while (0) + +static inline std::string cover_list_worker(std::string, std::string last) { + return last; +} + +template +std::string cover_list_worker(std::string prefix, std::string first, T... rest) { + std::string selected = cover_list_worker(prefix, rest...); + cover_extra(prefix, prefix + "." + first, first == selected); + return first == selected ? "" : selected; +} + +#else +# define cover(...) do { } while (0) +# define cover_list(...) do { } while (0) +#endif + + +// ------------------------------------------------------------ +// everything below this line are utilities for troubleshooting +// ------------------------------------------------------------ + +// simple timer for performance measurements +// toggle the '#if 1' to get a baseline for the performance penalty added by the measurement +struct PerformanceTimer +{ +#if 1 + int64_t total_ns; + + PerformanceTimer() { + total_ns = 0; + } + + static int64_t query() { +# if _WIN32 + return 0; +# elif defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) + struct timespec ts; + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts); + return int64_t(ts.tv_sec)*1000000000 + ts.tv_nsec; +# elif defined(RUSAGE_SELF) + struct rusage rusage; + int64_t t; + if (getrusage(RUSAGE_SELF, &rusage) == -1) { + log_cmd_error("getrusage failed!\n"); + log_abort(); + } + t = 1000000000ULL * (int64_t) rusage.ru_utime.tv_sec + (int64_t) rusage.ru_utime.tv_usec * 1000ULL; + t += 1000000000ULL * (int64_t) rusage.ru_stime.tv_sec + (int64_t) rusage.ru_stime.tv_usec * 1000ULL; + return t; +# else +# error Dont know how to measure per-process CPU time. Need alternative method (times()/clocks()/gettimeofday()?). +# endif + } + + void reset() { + total_ns = 0; + } + + void begin() { + total_ns -= query(); + } + + void end() { + total_ns += query(); + } + + float sec() const { + return total_ns * 1e-9f; + } +#else + static int64_t query() { return 0; } + void reset() { } + void begin() { } + void end() { } + float sec() const { return 0; } +#endif +}; + +// simple API for quickly dumping values when debugging + +static inline void log_dump_val_worker(short v) { log("%d", v); } +static inline void log_dump_val_worker(unsigned short v) { log("%u", v); } +static inline void log_dump_val_worker(int v) { log("%d", v); } +static inline void log_dump_val_worker(unsigned int v) { log("%u", v); } +static inline void log_dump_val_worker(long int v) { log("%ld", v); } +static inline void log_dump_val_worker(unsigned long int v) { log("%lu", v); } +#ifndef _WIN32 +static inline void log_dump_val_worker(long long int v) { log("%lld", v); } +static inline void log_dump_val_worker(unsigned long long int v) { log("%lld", v); } +#endif +static inline void log_dump_val_worker(char c) { log(c >= 32 && c < 127 ? "'%c'" : "'\\x%02x'", c); } +static inline void log_dump_val_worker(unsigned char c) { log(c >= 32 && c < 127 ? "'%c'" : "'\\x%02x'", c); } +static inline void log_dump_val_worker(bool v) { log("%s", v ? "true" : "false"); } +static inline void log_dump_val_worker(double v) { log("%f", v); } +static inline void log_dump_val_worker(char *v) { log("%s", v); } +static inline void log_dump_val_worker(const char *v) { log("%s", v); } +static inline void log_dump_val_worker(std::string v) { log("%s", v.c_str()); } +static inline void log_dump_val_worker(PerformanceTimer p) { log("%f seconds", p.sec()); } +static inline void log_dump_args_worker(const char *p YS_ATTRIBUTE(unused)) { log_assert(*p == 0); } +void log_dump_val_worker(RTLIL::IdString v); +void log_dump_val_worker(RTLIL::SigSpec v); + +template +static inline void log_dump_val_worker(dict &v) { + log("{"); + bool first = true; + for (auto &it : v) { + log(first ? " " : ", "); + log_dump_val_worker(it.first); + log(": "); + log_dump_val_worker(it.second); + first = false; + } + log(" }"); +} + +template +static inline void log_dump_val_worker(pool &v) { + log("{"); + bool first = true; + for (auto &it : v) { + log(first ? " " : ", "); + log_dump_val_worker(it); + first = false; + } + log(" }"); +} + +template +static inline void log_dump_val_worker(T *ptr) { log("%p", ptr); } + +template +void log_dump_args_worker(const char *p, T first, Args ... args) +{ + int next_p_state = 0; + const char *next_p = p; + while (*next_p && (next_p_state != 0 || *next_p != ',')) { + if (*next_p == '"') + do { + next_p++; + while (*next_p == '\\' && *(next_p + 1)) + next_p += 2; + } while (*next_p && *next_p != '"'); + if (*next_p == '\'') { + next_p++; + if (*next_p == '\\') + next_p++; + if (*next_p) + next_p++; + } + if (*next_p == '(' || *next_p == '[' || *next_p == '{') + next_p_state++; + if ((*next_p == ')' || *next_p == ']' || *next_p == '}') && next_p_state > 0) + next_p_state--; + next_p++; + } + log("\n\t%.*s => ", int(next_p - p), p); + if (*next_p == ',') + next_p++; + while (*next_p == ' ' || *next_p == '\t' || *next_p == '\r' || *next_p == '\n') + next_p++; + log_dump_val_worker(first); + log_dump_args_worker(next_p, args ...); +} + +#define log_dump(...) do { \ + log("DEBUG DUMP IN %s AT %s:%d:", __PRETTY_FUNCTION__, __FILE__, __LINE__); \ + log_dump_args_worker(#__VA_ARGS__, __VA_ARGS__); \ + log("\n"); \ +} while (0) + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/macc.h b/verilog/windows/autoyosys/share/include/kernel/macc.h new file mode 100644 index 0000000..286ce56 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/macc.h @@ -0,0 +1,242 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef MACC_H +#define MACC_H + +#include "kernel/yosys.h" + +YOSYS_NAMESPACE_BEGIN + +struct Macc +{ + struct port_t { + RTLIL::SigSpec in_a, in_b; + bool is_signed, do_subtract; + }; + + std::vector ports; + RTLIL::SigSpec bit_ports; + + void optimize(int width) + { + std::vector new_ports; + RTLIL::SigSpec new_bit_ports; + RTLIL::Const off(0, width); + + for (auto &port : ports) + { + if (GetSize(port.in_a) == 0 && GetSize(port.in_b) == 0) + continue; + + if (GetSize(port.in_a) < GetSize(port.in_b)) + std::swap(port.in_a, port.in_b); + + if (GetSize(port.in_a) == 1 && GetSize(port.in_b) == 0 && !port.is_signed && !port.do_subtract) { + bit_ports.append(port.in_a); + continue; + } + + if (port.in_a.is_fully_const() && port.in_b.is_fully_const()) { + RTLIL::Const v = port.in_a.as_const(); + if (GetSize(port.in_b)) + v = const_mul(v, port.in_b.as_const(), port.is_signed, port.is_signed, width); + if (port.do_subtract) + off = const_sub(off, v, port.is_signed, port.is_signed, width); + else + off = const_add(off, v, port.is_signed, port.is_signed, width); + continue; + } + + if (port.is_signed) { + while (GetSize(port.in_a) > 1 && port.in_a[GetSize(port.in_a)-1] == port.in_a[GetSize(port.in_a)-2]) + port.in_a.remove(GetSize(port.in_a)-1); + while (GetSize(port.in_b) > 1 && port.in_b[GetSize(port.in_b)-1] == port.in_b[GetSize(port.in_b)-2]) + port.in_b.remove(GetSize(port.in_b)-1); + } else { + while (GetSize(port.in_a) > 1 && port.in_a[GetSize(port.in_a)-1] == RTLIL::S0) + port.in_a.remove(GetSize(port.in_a)-1); + while (GetSize(port.in_b) > 1 && port.in_b[GetSize(port.in_b)-1] == RTLIL::S0) + port.in_b.remove(GetSize(port.in_b)-1); + } + + new_ports.push_back(port); + } + + for (auto &bit : bit_ports) + if (bit == RTLIL::S1) + off = const_add(off, RTLIL::Const(1, width), false, false, width); + else if (bit != RTLIL::S0) + new_bit_ports.append(bit); + + if (off.as_bool()) { + port_t port; + port.in_a = off; + port.is_signed = false; + port.do_subtract = false; + new_ports.push_back(port); + } + + new_ports.swap(ports); + bit_ports = new_bit_ports; + } + + void from_cell(RTLIL::Cell *cell) + { + RTLIL::SigSpec port_a = cell->getPort("\\A"); + + ports.clear(); + bit_ports = cell->getPort("\\B"); + + std::vector config_bits = cell->getParam("\\CONFIG").bits; + int config_cursor = 0; + +#ifndef NDEBUG + int config_width = cell->getParam("\\CONFIG_WIDTH").as_int(); + log_assert(GetSize(config_bits) >= config_width); +#endif + + int num_bits = 0; + if (config_bits[config_cursor++] == RTLIL::S1) num_bits |= 1; + if (config_bits[config_cursor++] == RTLIL::S1) num_bits |= 2; + if (config_bits[config_cursor++] == RTLIL::S1) num_bits |= 4; + if (config_bits[config_cursor++] == RTLIL::S1) num_bits |= 8; + + int port_a_cursor = 0; + while (port_a_cursor < GetSize(port_a)) + { + log_assert(config_cursor + 2 + 2*num_bits <= config_width); + + port_t this_port; + this_port.is_signed = config_bits[config_cursor++] == RTLIL::S1; + this_port.do_subtract = config_bits[config_cursor++] == RTLIL::S1; + + int size_a = 0; + for (int i = 0; i < num_bits; i++) + if (config_bits[config_cursor++] == RTLIL::S1) + size_a |= 1 << i; + + this_port.in_a = port_a.extract(port_a_cursor, size_a); + port_a_cursor += size_a; + + int size_b = 0; + for (int i = 0; i < num_bits; i++) + if (config_bits[config_cursor++] == RTLIL::S1) + size_b |= 1 << i; + + this_port.in_b = port_a.extract(port_a_cursor, size_b); + port_a_cursor += size_b; + + if (size_a || size_b) + ports.push_back(this_port); + } + + log_assert(config_cursor == config_width); + log_assert(port_a_cursor == GetSize(port_a)); + } + + void to_cell(RTLIL::Cell *cell) const + { + RTLIL::SigSpec port_a; + std::vector config_bits; + int max_size = 0, num_bits = 0; + + for (auto &port : ports) { + max_size = max(max_size, GetSize(port.in_a)); + max_size = max(max_size, GetSize(port.in_b)); + } + + while (max_size) + num_bits++, max_size /= 2; + + log_assert(num_bits < 16); + config_bits.push_back(num_bits & 1 ? RTLIL::S1 : RTLIL::S0); + config_bits.push_back(num_bits & 2 ? RTLIL::S1 : RTLIL::S0); + config_bits.push_back(num_bits & 4 ? RTLIL::S1 : RTLIL::S0); + config_bits.push_back(num_bits & 8 ? RTLIL::S1 : RTLIL::S0); + + for (auto &port : ports) + { + if (GetSize(port.in_a) == 0) + continue; + + config_bits.push_back(port.is_signed ? RTLIL::S1 : RTLIL::S0); + config_bits.push_back(port.do_subtract ? RTLIL::S1 : RTLIL::S0); + + int size_a = GetSize(port.in_a); + for (int i = 0; i < num_bits; i++) + config_bits.push_back(size_a & (1 << i) ? RTLIL::S1 : RTLIL::S0); + + int size_b = GetSize(port.in_b); + for (int i = 0; i < num_bits; i++) + config_bits.push_back(size_b & (1 << i) ? RTLIL::S1 : RTLIL::S0); + + port_a.append(port.in_a); + port_a.append(port.in_b); + } + + cell->setPort("\\A", port_a); + cell->setPort("\\B", bit_ports); + cell->setParam("\\CONFIG", config_bits); + cell->setParam("\\CONFIG_WIDTH", GetSize(config_bits)); + cell->setParam("\\A_WIDTH", GetSize(port_a)); + cell->setParam("\\B_WIDTH", GetSize(bit_ports)); + } + + bool eval(RTLIL::Const &result) const + { + for (auto &bit : result.bits) + bit = RTLIL::S0; + + for (auto &port : ports) + { + if (!port.in_a.is_fully_const() || !port.in_b.is_fully_const()) + return false; + + RTLIL::Const summand; + if (GetSize(port.in_b) == 0) + summand = const_pos(port.in_a.as_const(), port.in_b.as_const(), port.is_signed, port.is_signed, GetSize(result)); + else + summand = const_mul(port.in_a.as_const(), port.in_b.as_const(), port.is_signed, port.is_signed, GetSize(result)); + + if (port.do_subtract) + result = const_sub(result, summand, port.is_signed, port.is_signed, GetSize(result)); + else + result = const_add(result, summand, port.is_signed, port.is_signed, GetSize(result)); + } + + for (auto bit : bit_ports) { + if (bit.wire) + return false; + result = const_add(result, bit.data, false, false, GetSize(result)); + } + + return true; + } + + Macc(RTLIL::Cell *cell = nullptr) + { + if (cell != nullptr) + from_cell(cell); + } +}; + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/modtools.h b/verilog/windows/autoyosys/share/include/kernel/modtools.h new file mode 100644 index 0000000..ffcb48d --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/modtools.h @@ -0,0 +1,582 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef MODTOOLS_H +#define MODTOOLS_H + +#include "kernel/yosys.h" +#include "kernel/sigtools.h" +#include "kernel/celltypes.h" + +YOSYS_NAMESPACE_BEGIN + +struct ModIndex : public RTLIL::Monitor +{ + struct PortInfo { + RTLIL::Cell* cell; + RTLIL::IdString port; + int offset; + + PortInfo() : cell(), port(), offset() { } + PortInfo(RTLIL::Cell* _c, RTLIL::IdString _p, int _o) : cell(_c), port(_p), offset(_o) { } + + bool operator<(const PortInfo &other) const { + if (cell != other.cell) + return cell < other.cell; + if (offset != other.offset) + return offset < other.offset; + return port < other.port; + } + + bool operator==(const PortInfo &other) const { + return cell == other.cell && port == other.port && offset == other.offset; + } + + unsigned int hash() const { + return mkhash_add(mkhash(cell->name.hash(), port.hash()), offset); + } + }; + + struct SigBitInfo + { + bool is_input, is_output; + pool ports; + + SigBitInfo() : is_input(false), is_output(false) { } + + bool operator==(const SigBitInfo &other) const { + return is_input == other.is_input && is_output == other.is_output && ports == other.ports; + } + + void merge(const SigBitInfo &other) + { + is_input = is_input || other.is_input; + is_output = is_output || other.is_output; + ports.insert(other.ports.begin(), other.ports.end()); + } + }; + + SigMap sigmap; + RTLIL::Module *module; + std::map database; + int auto_reload_counter; + bool auto_reload_module; + + void port_add(RTLIL::Cell *cell, RTLIL::IdString port, const RTLIL::SigSpec &sig) + { + for (int i = 0; i < GetSize(sig); i++) { + RTLIL::SigBit bit = sigmap(sig[i]); + if (bit.wire) + database[bit].ports.insert(PortInfo(cell, port, i)); + } + } + + void port_del(RTLIL::Cell *cell, RTLIL::IdString port, const RTLIL::SigSpec &sig) + { + for (int i = 0; i < GetSize(sig); i++) { + RTLIL::SigBit bit = sigmap(sig[i]); + if (bit.wire) + database[bit].ports.erase(PortInfo(cell, port, i)); + } + } + + const SigBitInfo &info(RTLIL::SigBit bit) + { + return database[sigmap(bit)]; + } + + void reload_module(bool reset_sigmap = true) + { + if (reset_sigmap) { + sigmap.clear(); + sigmap.set(module); + } + + database.clear(); + for (auto wire : module->wires()) + if (wire->port_input || wire->port_output) + for (int i = 0; i < GetSize(wire); i++) { + RTLIL::SigBit bit = sigmap(RTLIL::SigBit(wire, i)); + if (bit.wire && wire->port_input) + database[bit].is_input = true; + if (bit.wire && wire->port_output) + database[bit].is_output = true; + } + for (auto cell : module->cells()) + for (auto &conn : cell->connections()) + port_add(cell, conn.first, conn.second); + + if (auto_reload_module) { + if (++auto_reload_counter > 2) + log_warning("Auto-reload in ModIndex -- possible performance bug!\n"); + auto_reload_module = false; + } + } + + void check() + { +#ifndef NDEBUG + if (auto_reload_module) + return; + + for (auto it : database) + log_assert(it.first == sigmap(it.first)); + + auto database_bak = std::move(database); + reload_module(false); + + if (!(database == database_bak)) + { + for (auto &it : database_bak) + if (!database.count(it.first)) + log("ModuleIndex::check(): Only in database_bak, not database: %s\n", log_signal(it.first)); + + for (auto &it : database) + if (!database_bak.count(it.first)) + log("ModuleIndex::check(): Only in database, not database_bak: %s\n", log_signal(it.first)); + else if (!(it.second == database_bak.at(it.first))) + log("ModuleIndex::check(): Different content for database[%s].\n", log_signal(it.first)); + + log_assert(database == database_bak); + } +#endif + } + + virtual void notify_connect(RTLIL::Cell *cell, const RTLIL::IdString &port, const RTLIL::SigSpec &old_sig, RTLIL::SigSpec &sig) YS_OVERRIDE + { + log_assert(module == cell->module); + + if (auto_reload_module) + return; + + port_del(cell, port, old_sig); + port_add(cell, port, sig); + } + + virtual void notify_connect(RTLIL::Module *mod YS_ATTRIBUTE(unused), const RTLIL::SigSig &sigsig) YS_OVERRIDE + { + log_assert(module == mod); + + if (auto_reload_module) + return; + + for (int i = 0; i < GetSize(sigsig.first); i++) + { + RTLIL::SigBit lhs = sigmap(sigsig.first[i]); + RTLIL::SigBit rhs = sigmap(sigsig.second[i]); + bool has_lhs = database.count(lhs) != 0; + bool has_rhs = database.count(rhs) != 0; + + if (!has_lhs && !has_rhs) { + sigmap.add(lhs, rhs); + } else + if (!has_rhs) { + SigBitInfo new_info = database.at(lhs); + database.erase(lhs); + sigmap.add(lhs, rhs); + lhs = sigmap(lhs); + if (lhs.wire) + database[lhs] = new_info; + } else + if (!has_lhs) { + SigBitInfo new_info = database.at(rhs); + database.erase(rhs); + sigmap.add(lhs, rhs); + rhs = sigmap(rhs); + if (rhs.wire) + database[rhs] = new_info; + } else { + SigBitInfo new_info = database.at(lhs); + new_info.merge(database.at(rhs)); + database.erase(lhs); + database.erase(rhs); + sigmap.add(lhs, rhs); + rhs = sigmap(rhs); + if (rhs.wire) + database[rhs] = new_info; + } + } + } + + virtual void notify_connect(RTLIL::Module *mod YS_ATTRIBUTE(unused), const std::vector&) YS_OVERRIDE + { + log_assert(module == mod); + auto_reload_module = true; + } + + virtual void notify_blackout(RTLIL::Module *mod YS_ATTRIBUTE(unused)) YS_OVERRIDE + { + log_assert(module == mod); + auto_reload_module = true; + } + + ModIndex(RTLIL::Module *_m) : sigmap(_m), module(_m) + { + auto_reload_counter = 0; + auto_reload_module = true; + module->monitors.insert(this); + } + + ~ModIndex() + { + module->monitors.erase(this); + } + + SigBitInfo *query(RTLIL::SigBit bit) + { + if (auto_reload_module) + reload_module(); + + auto it = database.find(sigmap(bit)); + if (it == database.end()) + return nullptr; + else + return &it->second; + } + + bool query_is_input(RTLIL::SigBit bit) + { + const SigBitInfo *info = query(bit); + if (info == nullptr) + return false; + return info->is_input; + } + + bool query_is_output(RTLIL::SigBit bit) + { + const SigBitInfo *info = query(bit); + if (info == nullptr) + return false; + return info->is_output; + } + + pool &query_ports(RTLIL::SigBit bit) + { + static pool empty_result_set; + SigBitInfo *info = query(bit); + if (info == nullptr) + return empty_result_set; + return info->ports; + } + + void dump_db() + { + log("--- ModIndex Dump ---\n"); + + if (auto_reload_module) { + log("AUTO-RELOAD\n"); + reload_module(); + } + + for (auto &it : database) { + log("BIT %s:\n", log_signal(it.first)); + if (it.second.is_input) + log(" PRIMARY INPUT\n"); + if (it.second.is_output) + log(" PRIMARY OUTPUT\n"); + for (auto &port : it.second.ports) + log(" PORT: %s.%s[%d] (%s)\n", log_id(port.cell), + log_id(port.port), port.offset, log_id(port.cell->type)); + } + } +}; + +struct ModWalker +{ + struct PortBit + { + RTLIL::Cell *cell; + RTLIL::IdString port; + int offset; + + bool operator<(const PortBit &other) const { + if (cell != other.cell) + return cell < other.cell; + if (port != other.port) + return port < other.port; + return offset < other.offset; + } + + bool operator==(const PortBit &other) const { + return cell == other.cell && port == other.port && offset == other.offset; + } + + unsigned int hash() const { + return mkhash_add(mkhash(cell->name.hash(), port.hash()), offset); + } + }; + + RTLIL::Design *design; + RTLIL::Module *module; + + CellTypes ct; + SigMap sigmap; + + dict> signal_drivers; + dict> signal_consumers; + pool signal_inputs, signal_outputs; + + dict> cell_outputs, cell_inputs; + + void add_wire(RTLIL::Wire *wire) + { + if (wire->port_input) { + std::vector bits = sigmap(wire); + for (auto bit : bits) + if (bit.wire != NULL) + signal_inputs.insert(bit); + } + + if (wire->port_output) { + std::vector bits = sigmap(wire); + for (auto bit : bits) + if (bit.wire != NULL) + signal_outputs.insert(bit); + } + } + + void add_cell_port(RTLIL::Cell *cell, RTLIL::IdString port, std::vector bits, bool is_output, bool is_input) + { + for (int i = 0; i < int(bits.size()); i++) + if (bits[i].wire != NULL) { + PortBit pbit = { cell, port, i }; + if (is_output) { + signal_drivers[bits[i]].insert(pbit); + cell_outputs[cell].insert(bits[i]); + } + if (is_input) { + signal_consumers[bits[i]].insert(pbit); + cell_inputs[cell].insert(bits[i]); + } + } + } + + void add_cell(RTLIL::Cell *cell) + { + if (ct.cell_known(cell->type)) { + for (auto &conn : cell->connections()) + add_cell_port(cell, conn.first, sigmap(conn.second), + ct.cell_output(cell->type, conn.first), + ct.cell_input(cell->type, conn.first)); + } else { + for (auto &conn : cell->connections()) + add_cell_port(cell, conn.first, sigmap(conn.second), true, true); + } + } + + ModWalker() : design(NULL), module(NULL) + { + } + + ModWalker(RTLIL::Design *design, RTLIL::Module *module, CellTypes *filter_ct = NULL) + { + setup(design, module, filter_ct); + } + + void setup(RTLIL::Design *design, RTLIL::Module *module, CellTypes *filter_ct = NULL) + { + this->design = design; + this->module = module; + + ct.clear(); + ct.setup(design); + sigmap.set(module); + + signal_drivers.clear(); + signal_consumers.clear(); + signal_inputs.clear(); + signal_outputs.clear(); + + for (auto &it : module->wires_) + add_wire(it.second); + for (auto &it : module->cells_) + if (filter_ct == NULL || filter_ct->cell_known(it.second->type)) + add_cell(it.second); + } + + // get_* methods -- single RTLIL::SigBit + + template + inline bool get_drivers(pool &result, RTLIL::SigBit bit) const + { + bool found = false; + if (signal_drivers.count(bit)) { + const pool &r = signal_drivers.at(bit); + result.insert(r.begin(), r.end()); + found = true; + } + return found; + } + + template + inline bool get_consumers(pool &result, RTLIL::SigBit bit) const + { + bool found = false; + if (signal_consumers.count(bit)) { + const pool &r = signal_consumers.at(bit); + result.insert(r.begin(), r.end()); + found = true; + } + return found; + } + + template + inline bool get_inputs(pool &result, RTLIL::SigBit bit) const + { + bool found = false; + if (signal_inputs.count(bit)) + result.insert(bit), found = true; + return found; + } + + template + inline bool get_outputs(pool &result, RTLIL::SigBit bit) const + { + bool found = false; + if (signal_outputs.count(bit)) + result.insert(bit), found = true; + return found; + } + + // get_* methods -- container of RTLIL::SigBit's (always by reference) + + template + inline bool get_drivers(pool &result, const T &bits) const + { + bool found = false; + for (RTLIL::SigBit bit : bits) + if (signal_drivers.count(bit)) { + const pool &r = signal_drivers.at(bit); + result.insert(r.begin(), r.end()); + found = true; + } + return found; + } + + template + inline bool get_consumers(pool &result, const T &bits) const + { + bool found = false; + for (RTLIL::SigBit bit : bits) + if (signal_consumers.count(bit)) { + const pool &r = signal_consumers.at(bit); + result.insert(r.begin(), r.end()); + found = true; + } + return found; + } + + template + inline bool get_inputs(pool &result, const T &bits) const + { + bool found = false; + for (RTLIL::SigBit bit : bits) + if (signal_inputs.count(bit)) + result.insert(bit), found = true; + return found; + } + + template + inline bool get_outputs(pool &result, const T &bits) const + { + bool found = false; + for (RTLIL::SigBit bit : bits) + if (signal_outputs.count(bit)) + result.insert(bit), found = true; + return found; + } + + // get_* methods -- call by RTLIL::SigSpec (always by value) + + bool get_drivers(pool &result, RTLIL::SigSpec signal) const + { + std::vector bits = sigmap(signal); + return get_drivers(result, bits); + } + + bool get_consumers(pool &result, RTLIL::SigSpec signal) const + { + std::vector bits = sigmap(signal); + return get_consumers(result, bits); + } + + bool get_inputs(pool &result, RTLIL::SigSpec signal) const + { + std::vector bits = sigmap(signal); + return get_inputs(result, bits); + } + + bool get_outputs(pool &result, RTLIL::SigSpec signal) const + { + std::vector bits = sigmap(signal); + return get_outputs(result, bits); + } + + // has_* methods -- call by reference + + template + inline bool has_drivers(const T &sig) const { + pool result; + return get_drivers(result, sig); + } + + template + inline bool has_consumers(const T &sig) const { + pool result; + return get_consumers(result, sig); + } + + template + inline bool has_inputs(const T &sig) const { + pool result; + return get_inputs(result, sig); + } + + template + inline bool has_outputs(const T &sig) const { + pool result; + return get_outputs(result, sig); + } + + // has_* methods -- call by value + + inline bool has_drivers(RTLIL::SigSpec sig) const { + pool result; + return get_drivers(result, sig); + } + + inline bool has_consumers(RTLIL::SigSpec sig) const { + pool result; + return get_consumers(result, sig); + } + + inline bool has_inputs(RTLIL::SigSpec sig) const { + pool result; + return get_inputs(result, sig); + } + + inline bool has_outputs(RTLIL::SigSpec sig) const { + pool result; + return get_outputs(result, sig); + } +}; + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/register.h b/verilog/windows/autoyosys/share/include/kernel/register.h new file mode 100644 index 0000000..8024c56 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/register.h @@ -0,0 +1,129 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include "kernel/yosys.h" + +#ifndef REGISTER_H +#define REGISTER_H + +YOSYS_NAMESPACE_BEGIN + +struct Pass +{ + std::string pass_name, short_help; + Pass(std::string name, std::string short_help = "** document me **"); + virtual ~Pass(); + + virtual void help(); + virtual void clear_flags(); + virtual void execute(std::vector args, RTLIL::Design *design) = 0; + + int call_counter; + int64_t runtime_ns; + + struct pre_post_exec_state_t { + Pass *parent_pass; + int64_t begin_ns; + }; + + pre_post_exec_state_t pre_execute(); + void post_execute(pre_post_exec_state_t state); + + void cmd_log_args(const std::vector &args); + void cmd_error(const std::vector &args, size_t argidx, std::string msg); + void extra_args(std::vector args, size_t argidx, RTLIL::Design *design, bool select = true); + + static void call(RTLIL::Design *design, std::string command); + static void call(RTLIL::Design *design, std::vector args); + + static void call_on_selection(RTLIL::Design *design, const RTLIL::Selection &selection, std::string command); + static void call_on_selection(RTLIL::Design *design, const RTLIL::Selection &selection, std::vector args); + + static void call_on_module(RTLIL::Design *design, RTLIL::Module *module, std::string command); + static void call_on_module(RTLIL::Design *design, RTLIL::Module *module, std::vector args); + + Pass *next_queued_pass; + virtual void run_register(); + static void init_register(); + static void done_register(); +}; + +struct ScriptPass : Pass +{ + bool block_active, help_mode; + RTLIL::Design *active_design; + std::string active_run_from, active_run_to; + + ScriptPass(std::string name, std::string short_help = "** document me **") : Pass(name, short_help) { } + + virtual void script() = 0; + + bool check_label(std::string label, std::string info = std::string()); + void run(std::string command, std::string info = std::string()); + void run_script(RTLIL::Design *design, std::string run_from = std::string(), std::string run_to = std::string()); + void help_script(); +}; + +struct Frontend : Pass +{ + // for reading of here documents + static FILE *current_script_file; + static std::string last_here_document; + + std::string frontend_name; + Frontend(std::string name, std::string short_help = "** document me **"); + virtual void run_register() YS_OVERRIDE; + virtual ~Frontend(); + virtual void execute(std::vector args, RTLIL::Design *design) YS_OVERRIDE YS_FINAL; + virtual void execute(std::istream *&f, std::string filename, std::vector args, RTLIL::Design *design) = 0; + + static std::vector next_args; + void extra_args(std::istream *&f, std::string &filename, std::vector args, size_t argidx); + + static void frontend_call(RTLIL::Design *design, std::istream *f, std::string filename, std::string command); + static void frontend_call(RTLIL::Design *design, std::istream *f, std::string filename, std::vector args); +}; + +struct Backend : Pass +{ + std::string backend_name; + Backend(std::string name, std::string short_help = "** document me **"); + virtual void run_register() YS_OVERRIDE; + virtual ~Backend(); + virtual void execute(std::vector args, RTLIL::Design *design) YS_OVERRIDE YS_FINAL; + virtual void execute(std::ostream *&f, std::string filename, std::vector args, RTLIL::Design *design) = 0; + + void extra_args(std::ostream *&f, std::string &filename, std::vector args, size_t argidx); + + static void backend_call(RTLIL::Design *design, std::ostream *f, std::string filename, std::string command); + static void backend_call(RTLIL::Design *design, std::ostream *f, std::string filename, std::vector args); +}; + +// implemented in passes/cmds/select.cc +extern void handle_extra_select_args(Pass *pass, std::vector args, size_t argidx, size_t args_size, RTLIL::Design *design); +extern RTLIL::Selection eval_select_args(const vector &args, RTLIL::Design *design); +extern void eval_select_op(vector &work, const string &op, RTLIL::Design *design); + +extern std::map pass_register; +extern std::map frontend_register; +extern std::map backend_register; + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/rtlil.h b/verilog/windows/autoyosys/share/include/kernel/rtlil.h new file mode 100644 index 0000000..9430dcb --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/rtlil.h @@ -0,0 +1,1348 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include "kernel/yosys.h" + +#ifndef RTLIL_H +#define RTLIL_H + +YOSYS_NAMESPACE_BEGIN + +namespace RTLIL +{ + enum State : unsigned char { + S0 = 0, + S1 = 1, + Sx = 2, // undefined value or conflict + Sz = 3, // high-impedance / not-connected + Sa = 4, // don't care (used only in cases) + Sm = 5 // marker (used internally by some passes) + }; + + enum SyncType : unsigned char { + ST0 = 0, // level sensitive: 0 + ST1 = 1, // level sensitive: 1 + STp = 2, // edge sensitive: posedge + STn = 3, // edge sensitive: negedge + STe = 4, // edge sensitive: both edges + STa = 5, // always active + STg = 6, // global clock + STi = 7 // init + }; + + enum ConstFlags : unsigned char { + CONST_FLAG_NONE = 0, + CONST_FLAG_STRING = 1, + CONST_FLAG_SIGNED = 2, // only used for parameters + CONST_FLAG_REAL = 4 // unused -- to be used for parameters + }; + + struct Const; + struct AttrObject; + struct Selection; + struct Monitor; + struct Design; + struct Module; + struct Wire; + struct Memory; + struct Cell; + struct SigChunk; + struct SigBit; + struct SigSpecIterator; + struct SigSpecConstIterator; + struct SigSpec; + struct CaseRule; + struct SwitchRule; + struct SyncRule; + struct Process; + + typedef std::pair SigSig; + + struct IdString + { + // the global id string cache + + static struct destruct_guard_t { + bool ok; // POD, will be initialized to zero + destruct_guard_t() { ok = true; } + ~destruct_guard_t() { ok = false; } + } destruct_guard; + + static std::vector global_refcount_storage_; + static std::vector global_id_storage_; + static dict global_id_index_; + static std::vector global_free_idx_list_; + + static inline int get_reference(int idx) + { + global_refcount_storage_.at(idx)++; + return idx; + } + + static inline int get_reference(const char *p) + { + log_assert(destruct_guard.ok); + + if (p[0]) { + log_assert(p[1] != 0); + log_assert(p[0] == '$' || p[0] == '\\'); + } + + auto it = global_id_index_.find((char*)p); + if (it != global_id_index_.end()) { + global_refcount_storage_.at(it->second)++; + return it->second; + } + + if (global_free_idx_list_.empty()) { + log_assert(global_id_storage_.size() < 0x40000000); + global_free_idx_list_.push_back(global_id_storage_.size()); + global_id_storage_.push_back(nullptr); + global_refcount_storage_.push_back(0); + } + + int idx = global_free_idx_list_.back(); + global_free_idx_list_.pop_back(); + global_id_storage_.at(idx) = strdup(p); + global_id_index_[global_id_storage_.at(idx)] = idx; + global_refcount_storage_.at(idx)++; + + // Avoid Create->Delete->Create pattern + static IdString last_created_id; + put_reference(last_created_id.index_); + last_created_id.index_ = idx; + get_reference(last_created_id.index_); + + if (yosys_xtrace) { + log("#X# New IdString '%s' with index %d.\n", p, idx); + log_backtrace("-X- ", yosys_xtrace-1); + } + + return idx; + } + + static inline void put_reference(int idx) + { + // put_reference() may be called from destructors after the destructor of + // global_refcount_storage_ has been run. in this case we simply do nothing. + if (!destruct_guard.ok) + return; + + log_assert(global_refcount_storage_.at(idx) > 0); + + if (--global_refcount_storage_.at(idx) != 0) + return; + + if (yosys_xtrace) { + log("#X# Removed IdString '%s' with index %d.\n", global_id_storage_.at(idx), idx); + log_backtrace("-X- ", yosys_xtrace-1); + } + + global_id_index_.erase(global_id_storage_.at(idx)); + free(global_id_storage_.at(idx)); + global_id_storage_.at(idx) = nullptr; + global_free_idx_list_.push_back(idx); + } + + // the actual IdString object is just is a single int + + int index_; + + IdString() : index_(get_reference("")) { } + IdString(const char *str) : index_(get_reference(str)) { } + IdString(const IdString &str) : index_(get_reference(str.index_)) { } + IdString(const std::string &str) : index_(get_reference(str.c_str())) { } + ~IdString() { put_reference(index_); } + + void operator=(const IdString &rhs) { + put_reference(index_); + index_ = get_reference(rhs.index_); + } + + void operator=(const char *rhs) { + IdString id(rhs); + *this = id; + } + + void operator=(const std::string &rhs) { + IdString id(rhs); + *this = id; + } + + const char *c_str() const { + return global_id_storage_.at(index_); + } + + std::string str() const { + return std::string(global_id_storage_.at(index_)); + } + + bool operator<(const IdString &rhs) const { + return index_ < rhs.index_; + } + + bool operator==(const IdString &rhs) const { return index_ == rhs.index_; } + bool operator!=(const IdString &rhs) const { return index_ != rhs.index_; } + + // The methods below are just convenience functions for better compatibility with std::string. + + bool operator==(const std::string &rhs) const { return str() == rhs; } + bool operator!=(const std::string &rhs) const { return str() != rhs; } + + bool operator==(const char *rhs) const { return strcmp(c_str(), rhs) == 0; } + bool operator!=(const char *rhs) const { return strcmp(c_str(), rhs) != 0; } + + char operator[](size_t i) const { + const char *p = c_str(); + for (; i != 0; i--, p++) + log_assert(*p != 0); + return *p; + } + + std::string substr(size_t pos = 0, size_t len = std::string::npos) const { + if (len == std::string::npos || len >= strlen(c_str() + pos)) + return std::string(c_str() + pos); + else + return std::string(c_str() + pos, len); + } + + size_t size() const { + return str().size(); + } + + bool empty() const { + return c_str()[0] == 0; + } + + void clear() { + *this = IdString(); + } + + unsigned int hash() const { + return index_; + } + + // The following is a helper key_compare class. Instead of for example std::set + // use std::set> if the order of cells in the + // set has an influence on the algorithm. + + template struct compare_ptr_by_name { + bool operator()(const T *a, const T *b) const { + return (a == nullptr || b == nullptr) ? (a < b) : (a->name < b->name); + } + }; + + // often one needs to check if a given IdString is part of a list (for example a list + // of cell types). the following functions helps with that. + + template + bool in(T first, Args... rest) const { + return in(first) || in(rest...); + } + + bool in(IdString rhs) const { return *this == rhs; } + bool in(const char *rhs) const { return *this == rhs; } + bool in(const std::string &rhs) const { return *this == rhs; } + bool in(const pool &rhs) const { return rhs.count(*this) != 0; } + }; + + static inline std::string escape_id(std::string str) { + if (str.size() > 0 && str[0] != '\\' && str[0] != '$') + return "\\" + str; + return str; + } + + static inline std::string unescape_id(std::string str) { + if (str.size() < 2) + return str; + if (str[0] != '\\') + return str; + if (str[1] == '$' || str[1] == '\\') + return str; + if (str[1] >= '0' && str[1] <= '9') + return str; + return str.substr(1); + } + + static inline std::string unescape_id(RTLIL::IdString str) { + return unescape_id(str.str()); + } + + static inline const char *id2cstr(const RTLIL::IdString &str) { + return log_id(str); + } + + template struct sort_by_name_id { + bool operator()(T *a, T *b) const { + return a->name < b->name; + } + }; + + template struct sort_by_name_str { + bool operator()(T *a, T *b) const { + return strcmp(a->name.c_str(), b->name.c_str()) < 0; + } + }; + + struct sort_by_id_str { + bool operator()(RTLIL::IdString a, RTLIL::IdString b) const { + return strcmp(a.c_str(), b.c_str()) < 0; + } + }; + + // see calc.cc for the implementation of this functions + RTLIL::Const const_not (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_and (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_or (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_xor (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_xnor (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + + RTLIL::Const const_reduce_and (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_reduce_or (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_reduce_xor (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_reduce_xnor (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_reduce_bool (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + + RTLIL::Const const_logic_not (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_logic_and (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_logic_or (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + + RTLIL::Const const_shl (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_shr (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_sshl (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_sshr (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_shift (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_shiftx (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + + RTLIL::Const const_lt (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_le (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_eq (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_ne (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_eqx (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_nex (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_ge (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_gt (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + + RTLIL::Const const_add (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_sub (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_mul (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_div (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_mod (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_pow (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + + RTLIL::Const const_pos (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_neg (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + + + // This iterator-range-pair is used for Design::modules(), Module::wires() and Module::cells(). + // It maintains a reference counter that is used to make sure that the container is not modified while being iterated over. + + template + struct ObjIterator + { + typename dict::iterator it; + dict *list_p; + int *refcount_p; + + ObjIterator() : list_p(nullptr), refcount_p(nullptr) { + } + + ObjIterator(decltype(list_p) list_p, int *refcount_p) : list_p(list_p), refcount_p(refcount_p) { + if (list_p->empty()) { + this->list_p = nullptr; + this->refcount_p = nullptr; + } else { + it = list_p->begin(); + (*refcount_p)++; + } + } + + ObjIterator(const RTLIL::ObjIterator &other) { + it = other.it; + list_p = other.list_p; + refcount_p = other.refcount_p; + if (refcount_p) + (*refcount_p)++; + } + + ObjIterator &operator=(const RTLIL::ObjIterator &other) { + if (refcount_p) + (*refcount_p)--; + it = other.it; + list_p = other.list_p; + refcount_p = other.refcount_p; + if (refcount_p) + (*refcount_p)++; + return *this; + } + + ~ObjIterator() { + if (refcount_p) + (*refcount_p)--; + } + + inline T operator*() const { + log_assert(list_p != nullptr); + return it->second; + } + + inline bool operator!=(const RTLIL::ObjIterator &other) const { + if (list_p == nullptr || other.list_p == nullptr) + return list_p != other.list_p; + return it != other.it; + } + + inline void operator++() { + log_assert(list_p != nullptr); + if (++it == list_p->end()) { + (*refcount_p)--; + list_p = nullptr; + refcount_p = nullptr; + } + } + }; + + template + struct ObjRange + { + dict *list_p; + int *refcount_p; + + ObjRange(decltype(list_p) list_p, int *refcount_p) : list_p(list_p), refcount_p(refcount_p) { } + RTLIL::ObjIterator begin() { return RTLIL::ObjIterator(list_p, refcount_p); } + RTLIL::ObjIterator end() { return RTLIL::ObjIterator(); } + + size_t size() const { + return list_p->size(); + } + + operator pool() const { + pool result; + for (auto &it : *list_p) + result.insert(it.second); + return result; + } + + operator std::vector() const { + std::vector result; + result.reserve(list_p->size()); + for (auto &it : *list_p) + result.push_back(it.second); + return result; + } + + pool to_pool() const { return *this; } + std::vector to_vector() const { return *this; } + }; +}; + +struct RTLIL::Const +{ + int flags; + std::vector bits; + + Const(); + Const(std::string str); + Const(int val, int width = 32); + Const(RTLIL::State bit, int width = 1); + Const(const std::vector &bits) : bits(bits) { flags = CONST_FLAG_NONE; } + Const(const std::vector &bits); + + bool operator <(const RTLIL::Const &other) const; + bool operator ==(const RTLIL::Const &other) const; + bool operator !=(const RTLIL::Const &other) const; + + bool as_bool() const; + int as_int(bool is_signed = false) const; + std::string as_string() const; + static Const from_string(std::string str); + + std::string decode_string() const; + + inline int size() const { return bits.size(); } + inline RTLIL::State &operator[](int index) { return bits.at(index); } + inline const RTLIL::State &operator[](int index) const { return bits.at(index); } + + inline RTLIL::Const extract(int offset, int len = 1, RTLIL::State padding = RTLIL::State::S0) const { + RTLIL::Const ret; + ret.bits.reserve(len); + for (int i = offset; i < offset + len; i++) + ret.bits.push_back(i < GetSize(bits) ? bits[i] : padding); + return ret; + } + + inline unsigned int hash() const { + unsigned int h = mkhash_init; + for (auto b : bits) + mkhash(h, b); + return h; + } +}; + +struct RTLIL::AttrObject +{ + dict attributes; + + void set_bool_attribute(RTLIL::IdString id); + bool get_bool_attribute(RTLIL::IdString id) const; + void set_strpool_attribute(RTLIL::IdString id, const pool &data); + void add_strpool_attribute(RTLIL::IdString id, const pool &data); + pool get_strpool_attribute(RTLIL::IdString id) const; +}; + +struct RTLIL::SigChunk +{ + RTLIL::Wire *wire; + std::vector data; // only used if wire == NULL, LSB at index 0 + int width, offset; + + SigChunk(); + SigChunk(const RTLIL::Const &value); + SigChunk(RTLIL::Wire *wire); + SigChunk(RTLIL::Wire *wire, int offset, int width = 1); + SigChunk(const std::string &str); + SigChunk(int val, int width = 32); + SigChunk(RTLIL::State bit, int width = 1); + SigChunk(RTLIL::SigBit bit); + + RTLIL::SigChunk extract(int offset, int length) const; + + bool operator <(const RTLIL::SigChunk &other) const; + bool operator ==(const RTLIL::SigChunk &other) const; + bool operator !=(const RTLIL::SigChunk &other) const; +}; + +struct RTLIL::SigBit +{ + RTLIL::Wire *wire; + union { + RTLIL::State data; // used if wire == NULL + int offset; // used if wire != NULL + }; + + SigBit(); + SigBit(RTLIL::State bit); + SigBit(bool bit); + SigBit(RTLIL::Wire *wire); + SigBit(RTLIL::Wire *wire, int offset); + SigBit(const RTLIL::SigChunk &chunk); + SigBit(const RTLIL::SigChunk &chunk, int index); + SigBit(const RTLIL::SigSpec &sig); + + bool operator <(const RTLIL::SigBit &other) const; + bool operator ==(const RTLIL::SigBit &other) const; + bool operator !=(const RTLIL::SigBit &other) const; + unsigned int hash() const; +}; + +struct RTLIL::SigSpecIterator : public std::iterator +{ + RTLIL::SigSpec *sig_p; + int index; + + inline RTLIL::SigBit &operator*() const; + inline bool operator!=(const RTLIL::SigSpecIterator &other) const { return index != other.index; } + inline bool operator==(const RTLIL::SigSpecIterator &other) const { return index == other.index; } + inline void operator++() { index++; } +}; + +struct RTLIL::SigSpecConstIterator : public std::iterator +{ + const RTLIL::SigSpec *sig_p; + int index; + + inline const RTLIL::SigBit &operator*() const; + inline bool operator!=(const RTLIL::SigSpecConstIterator &other) const { return index != other.index; } + inline bool operator==(const RTLIL::SigSpecIterator &other) const { return index == other.index; } + inline void operator++() { index++; } +}; + +struct RTLIL::SigSpec +{ +private: + int width_; + unsigned long hash_; + std::vector chunks_; // LSB at index 0 + std::vector bits_; // LSB at index 0 + + void pack() const; + void unpack() const; + void updhash() const; + + inline bool packed() const { + return bits_.empty(); + } + + inline void inline_unpack() const { + if (!chunks_.empty()) + unpack(); + } + +public: + SigSpec(); + SigSpec(const RTLIL::SigSpec &other); + SigSpec(std::initializer_list parts); + const RTLIL::SigSpec &operator=(const RTLIL::SigSpec &other); + + SigSpec(const RTLIL::Const &value); + SigSpec(const RTLIL::SigChunk &chunk); + SigSpec(RTLIL::Wire *wire); + SigSpec(RTLIL::Wire *wire, int offset, int width = 1); + SigSpec(const std::string &str); + SigSpec(int val, int width = 32); + SigSpec(RTLIL::State bit, int width = 1); + SigSpec(RTLIL::SigBit bit, int width = 1); + SigSpec(std::vector chunks); + SigSpec(std::vector bits); + SigSpec(pool bits); + SigSpec(std::set bits); + SigSpec(bool bit); + + SigSpec(RTLIL::SigSpec &&other) { + width_ = other.width_; + hash_ = other.hash_; + chunks_ = std::move(other.chunks_); + bits_ = std::move(other.bits_); + } + + const RTLIL::SigSpec &operator=(RTLIL::SigSpec &&other) { + width_ = other.width_; + hash_ = other.hash_; + chunks_ = std::move(other.chunks_); + bits_ = std::move(other.bits_); + return *this; + } + + size_t get_hash() const { + if (!hash_) hash(); + return hash_; + } + + inline const std::vector &chunks() const { pack(); return chunks_; } + inline const std::vector &bits() const { inline_unpack(); return bits_; } + + inline int size() const { return width_; } + inline bool empty() const { return width_ == 0; } + + inline RTLIL::SigBit &operator[](int index) { inline_unpack(); return bits_.at(index); } + inline const RTLIL::SigBit &operator[](int index) const { inline_unpack(); return bits_.at(index); } + + inline RTLIL::SigSpecIterator begin() { RTLIL::SigSpecIterator it; it.sig_p = this; it.index = 0; return it; } + inline RTLIL::SigSpecIterator end() { RTLIL::SigSpecIterator it; it.sig_p = this; it.index = width_; return it; } + + inline RTLIL::SigSpecConstIterator begin() const { RTLIL::SigSpecConstIterator it; it.sig_p = this; it.index = 0; return it; } + inline RTLIL::SigSpecConstIterator end() const { RTLIL::SigSpecConstIterator it; it.sig_p = this; it.index = width_; return it; } + + void sort(); + void sort_and_unify(); + + void replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with); + void replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with, RTLIL::SigSpec *other) const; + + void replace(const dict &rules); + void replace(const dict &rules, RTLIL::SigSpec *other) const; + + void replace(const std::map &rules); + void replace(const std::map &rules, RTLIL::SigSpec *other) const; + + void replace(int offset, const RTLIL::SigSpec &with); + + void remove(const RTLIL::SigSpec &pattern); + void remove(const RTLIL::SigSpec &pattern, RTLIL::SigSpec *other) const; + void remove2(const RTLIL::SigSpec &pattern, RTLIL::SigSpec *other); + + void remove(const pool &pattern); + void remove(const pool &pattern, RTLIL::SigSpec *other) const; + void remove2(const pool &pattern, RTLIL::SigSpec *other); + void remove2(const std::set &pattern, RTLIL::SigSpec *other); + + void remove(int offset, int length = 1); + void remove_const(); + + RTLIL::SigSpec extract(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec *other = NULL) const; + RTLIL::SigSpec extract(const pool &pattern, const RTLIL::SigSpec *other = NULL) const; + RTLIL::SigSpec extract(int offset, int length = 1) const; + + void append(const RTLIL::SigSpec &signal); + void append_bit(const RTLIL::SigBit &bit); + + void extend_u0(int width, bool is_signed = false); + + RTLIL::SigSpec repeat(int num) const; + + bool operator <(const RTLIL::SigSpec &other) const; + bool operator ==(const RTLIL::SigSpec &other) const; + inline bool operator !=(const RTLIL::SigSpec &other) const { return !(*this == other); } + + bool is_wire() const; + bool is_chunk() const; + inline bool is_bit() const { return width_ == 1; } + + bool is_fully_const() const; + bool is_fully_zero() const; + bool is_fully_def() const; + bool is_fully_undef() const; + bool has_const() const; + bool has_marked_bits() const; + + bool as_bool() const; + int as_int(bool is_signed = false) const; + std::string as_string() const; + RTLIL::Const as_const() const; + RTLIL::Wire *as_wire() const; + RTLIL::SigChunk as_chunk() const; + RTLIL::SigBit as_bit() const; + + bool match(std::string pattern) const; + + std::set to_sigbit_set() const; + pool to_sigbit_pool() const; + std::vector to_sigbit_vector() const; + std::map to_sigbit_map(const RTLIL::SigSpec &other) const; + dict to_sigbit_dict(const RTLIL::SigSpec &other) const; + + static bool parse(RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str); + static bool parse_sel(RTLIL::SigSpec &sig, RTLIL::Design *design, RTLIL::Module *module, std::string str); + static bool parse_rhs(const RTLIL::SigSpec &lhs, RTLIL::SigSpec &sig, RTLIL::Module *module, std::string str); + + operator std::vector() const { return chunks(); } + operator std::vector() const { return bits(); } + + unsigned int hash() const { if (!hash_) updhash(); return hash_; }; + +#ifndef NDEBUG + void check() const; +#else + void check() const { } +#endif +}; + +struct RTLIL::Selection +{ + bool full_selection; + pool selected_modules; + dict> selected_members; + + Selection(bool full = true) : full_selection(full) { } + + bool selected_module(RTLIL::IdString mod_name) const; + bool selected_whole_module(RTLIL::IdString mod_name) const; + bool selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const; + void optimize(RTLIL::Design *design); + + template void select(T1 *module) { + if (!full_selection && selected_modules.count(module->name) == 0) { + selected_modules.insert(module->name); + selected_members.erase(module->name); + } + } + + template void select(T1 *module, T2 *member) { + if (!full_selection && selected_modules.count(module->name) == 0) + selected_members[module->name].insert(member->name); + } + + bool empty() const { + return !full_selection && selected_modules.empty() && selected_members.empty(); + } +}; + +struct RTLIL::Monitor +{ + unsigned int hashidx_; + unsigned int hash() const { return hashidx_; } + + Monitor() { + static unsigned int hashidx_count = 123456789; + hashidx_count = mkhash_xorshift(hashidx_count); + hashidx_ = hashidx_count; + } + + virtual ~Monitor() { } + virtual void notify_module_add(RTLIL::Module*) { } + virtual void notify_module_del(RTLIL::Module*) { } + virtual void notify_connect(RTLIL::Cell*, const RTLIL::IdString&, const RTLIL::SigSpec&, RTLIL::SigSpec&) { } + virtual void notify_connect(RTLIL::Module*, const RTLIL::SigSig&) { } + virtual void notify_connect(RTLIL::Module*, const std::vector&) { } + virtual void notify_blackout(RTLIL::Module*) { } +}; + +struct RTLIL::Design +{ + unsigned int hashidx_; + unsigned int hash() const { return hashidx_; } + + pool monitors; + dict scratchpad; + + int refcount_modules_; + dict modules_; + std::vector verilog_packages; + + std::vector selection_stack; + dict selection_vars; + std::string selected_active_module; + + Design(); + ~Design(); + + RTLIL::ObjRange modules(); + RTLIL::Module *module(RTLIL::IdString name); + RTLIL::Module *top_module(); + + bool has(RTLIL::IdString id) const { + return modules_.count(id) != 0; + } + + void add(RTLIL::Module *module); + RTLIL::Module *addModule(RTLIL::IdString name); + void remove(RTLIL::Module *module); + void rename(RTLIL::Module *module, RTLIL::IdString new_name); + + void scratchpad_unset(std::string varname); + + void scratchpad_set_int(std::string varname, int value); + void scratchpad_set_bool(std::string varname, bool value); + void scratchpad_set_string(std::string varname, std::string value); + + int scratchpad_get_int(std::string varname, int default_value = 0) const; + bool scratchpad_get_bool(std::string varname, bool default_value = false) const; + std::string scratchpad_get_string(std::string varname, std::string default_value = std::string()) const; + + void sort(); + void check(); + void optimize(); + + bool selected_module(RTLIL::IdString mod_name) const; + bool selected_whole_module(RTLIL::IdString mod_name) const; + bool selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const; + + bool selected_module(RTLIL::Module *mod) const; + bool selected_whole_module(RTLIL::Module *mod) const; + + RTLIL::Selection &selection() { + return selection_stack.back(); + } + + const RTLIL::Selection &selection() const { + return selection_stack.back(); + } + + bool full_selection() const { + return selection_stack.back().full_selection; + } + + template bool selected(T1 *module) const { + return selected_module(module->name); + } + + template bool selected(T1 *module, T2 *member) const { + return selected_member(module->name, member->name); + } + + template void select(T1 *module, T2 *member) { + if (selection_stack.size() > 0) { + RTLIL::Selection &sel = selection_stack.back(); + sel.select(module, member); + } + } + + std::vector selected_modules() const; + std::vector selected_whole_modules() const; + std::vector selected_whole_modules_warn() const; +}; + +struct RTLIL::Module : public RTLIL::AttrObject +{ + unsigned int hashidx_; + unsigned int hash() const { return hashidx_; } + +protected: + void add(RTLIL::Wire *wire); + void add(RTLIL::Cell *cell); + +public: + RTLIL::Design *design; + pool monitors; + + int refcount_wires_; + int refcount_cells_; + + dict wires_; + dict cells_; + std::vector connections_; + + RTLIL::IdString name; + pool avail_parameters; + dict memories; + dict processes; + + Module(); + virtual ~Module(); + virtual RTLIL::IdString derive(RTLIL::Design *design, dict parameters); + virtual size_t count_id(RTLIL::IdString id); + + virtual void sort(); + virtual void check(); + virtual void optimize(); + + void connect(const RTLIL::SigSig &conn); + void connect(const RTLIL::SigSpec &lhs, const RTLIL::SigSpec &rhs); + void new_connections(const std::vector &new_conn); + const std::vector &connections() const; + + std::vector ports; + void fixup_ports(); + + template void rewrite_sigspecs(T functor); + void cloneInto(RTLIL::Module *new_mod) const; + virtual RTLIL::Module *clone() const; + + bool has_memories() const; + bool has_processes() const; + + bool has_memories_warn() const; + bool has_processes_warn() const; + + std::vector selected_wires() const; + std::vector selected_cells() const; + + template bool selected(T *member) const { + return design->selected_member(name, member->name); + } + + RTLIL::Wire* wire(RTLIL::IdString id) { return wires_.count(id) ? wires_.at(id) : nullptr; } + RTLIL::Cell* cell(RTLIL::IdString id) { return cells_.count(id) ? cells_.at(id) : nullptr; } + + RTLIL::ObjRange wires() { return RTLIL::ObjRange(&wires_, &refcount_wires_); } + RTLIL::ObjRange cells() { return RTLIL::ObjRange(&cells_, &refcount_cells_); } + + // Removing wires is expensive. If you have to remove wires, remove them all at once. + void remove(const pool &wires); + void remove(RTLIL::Cell *cell); + + void rename(RTLIL::Wire *wire, RTLIL::IdString new_name); + void rename(RTLIL::Cell *cell, RTLIL::IdString new_name); + void rename(RTLIL::IdString old_name, RTLIL::IdString new_name); + + void swap_names(RTLIL::Wire *w1, RTLIL::Wire *w2); + void swap_names(RTLIL::Cell *c1, RTLIL::Cell *c2); + + RTLIL::IdString uniquify(RTLIL::IdString name); + RTLIL::IdString uniquify(RTLIL::IdString name, int &index); + + RTLIL::Wire *addWire(RTLIL::IdString name, int width = 1); + RTLIL::Wire *addWire(RTLIL::IdString name, const RTLIL::Wire *other); + + RTLIL::Cell *addCell(RTLIL::IdString name, RTLIL::IdString type); + RTLIL::Cell *addCell(RTLIL::IdString name, const RTLIL::Cell *other); + + // The add* methods create a cell and return the created cell. All signals must exist in advance. + + RTLIL::Cell* addNot (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addPos (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addNeg (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false); + + RTLIL::Cell* addAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addXor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addXnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + + RTLIL::Cell* addReduceAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addReduceOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addReduceXor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addReduceXnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addReduceBool (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false); + + RTLIL::Cell* addShl (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addShr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addSshl (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addSshr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addShift (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addShiftx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + + RTLIL::Cell* addLt (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addLe (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addEq (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addNe (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addEqx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addNex (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addGe (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addGt (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + + RTLIL::Cell* addAdd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addSub (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addMul (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addDiv (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addMod (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addPow (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool a_signed = false, bool b_signed = false); + + RTLIL::Cell* addLogicNot (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addLogicAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + RTLIL::Cell* addLogicOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool is_signed = false); + + RTLIL::Cell* addMux (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, RTLIL::SigSpec sig_y); + RTLIL::Cell* addPmux (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, RTLIL::SigSpec sig_y); + + RTLIL::Cell* addSlice (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, RTLIL::Const offset); + RTLIL::Cell* addConcat (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y); + RTLIL::Cell* addLut (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, RTLIL::Const lut); + RTLIL::Cell* addTribuf (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_y); + RTLIL::Cell* addAssert (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en); + RTLIL::Cell* addAssume (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_en); + RTLIL::Cell* addEquiv (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y); + + RTLIL::Cell* addSr (RTLIL::IdString name, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, RTLIL::SigSpec sig_q, bool set_polarity = true, bool clr_polarity = true); + RTLIL::Cell* addFf (RTLIL::IdString name, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q); + RTLIL::Cell* addDff (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true); + RTLIL::Cell* addDffe (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool en_polarity = true); + RTLIL::Cell* addDffsr (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, + RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true); + RTLIL::Cell* addAdff (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, + RTLIL::Const arst_value, bool clk_polarity = true, bool arst_polarity = true); + RTLIL::Cell* addDlatch (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true); + RTLIL::Cell* addDlatchsr (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, + RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true); + + RTLIL::Cell* addBufGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_y); + RTLIL::Cell* addNotGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_y); + RTLIL::Cell* addAndGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y); + RTLIL::Cell* addNandGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y); + RTLIL::Cell* addOrGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y); + RTLIL::Cell* addNorGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y); + RTLIL::Cell* addXorGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y); + RTLIL::Cell* addXnorGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y); + RTLIL::Cell* addMuxGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s, RTLIL::SigBit sig_y); + RTLIL::Cell* addAoi3Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y); + RTLIL::Cell* addOai3Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y); + RTLIL::Cell* addAoi4Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y); + RTLIL::Cell* addOai4Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y); + + RTLIL::Cell* addFfGate (RTLIL::IdString name, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q); + RTLIL::Cell* addDffGate (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true); + RTLIL::Cell* addDffeGate (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool en_polarity = true); + RTLIL::Cell* addDffsrGate (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, + RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true); + RTLIL::Cell* addAdffGate (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, + bool arst_value = false, bool clk_polarity = true, bool arst_polarity = true); + RTLIL::Cell* addDlatchGate (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true); + RTLIL::Cell* addDlatchsrGate (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr, + RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true); + + // The methods without the add* prefix create a cell and an output signal. They return the newly created output signal. + + RTLIL::SigSpec Not (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + RTLIL::SigSpec Pos (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + RTLIL::SigSpec Bu0 (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + RTLIL::SigSpec Neg (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + + RTLIL::SigSpec And (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Or (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Xor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Xnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + + RTLIL::SigSpec ReduceAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + RTLIL::SigSpec ReduceOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + RTLIL::SigSpec ReduceXor (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + RTLIL::SigSpec ReduceXnor (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + RTLIL::SigSpec ReduceBool (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + + RTLIL::SigSpec Shl (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Shr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Sshl (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Sshr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Shift (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Shiftx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + + RTLIL::SigSpec Lt (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Le (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Eq (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Ne (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Eqx (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Nex (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Ge (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Gt (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + + RTLIL::SigSpec Add (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Sub (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Mul (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Div (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Mod (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec Pow (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool a_signed = false, bool b_signed = false); + + RTLIL::SigSpec LogicNot (RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed = false); + RTLIL::SigSpec LogicAnd (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + RTLIL::SigSpec LogicOr (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed = false); + + RTLIL::SigSpec Mux (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s); + RTLIL::SigSpec Pmux (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s); + + RTLIL::SigBit BufGate (RTLIL::IdString name, RTLIL::SigBit sig_a); + RTLIL::SigBit NotGate (RTLIL::IdString name, RTLIL::SigBit sig_a); + RTLIL::SigBit AndGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b); + RTLIL::SigBit NandGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b); + RTLIL::SigBit OrGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b); + RTLIL::SigBit NorGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b); + RTLIL::SigBit XorGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b); + RTLIL::SigBit XnorGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b); + RTLIL::SigBit MuxGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s); + RTLIL::SigBit Aoi3Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c); + RTLIL::SigBit Oai3Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c); + RTLIL::SigBit Aoi4Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d); + RTLIL::SigBit Oai4Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d); + + RTLIL::SigSpec Anyconst (RTLIL::IdString name, int width = 1); + RTLIL::SigSpec Anyseq (RTLIL::IdString name, int width = 1); + RTLIL::SigSpec Initstate (RTLIL::IdString name); +}; + +struct RTLIL::Wire : public RTLIL::AttrObject +{ + unsigned int hashidx_; + unsigned int hash() const { return hashidx_; } + +protected: + // use module->addWire() and module->remove() to create or destroy wires + friend struct RTLIL::Module; + Wire(); + ~Wire() { }; + +public: + // do not simply copy wires + Wire(RTLIL::Wire &other) = delete; + void operator=(RTLIL::Wire &other) = delete; + + RTLIL::Module *module; + RTLIL::IdString name; + int width, start_offset, port_id; + bool port_input, port_output, upto; +}; + +struct RTLIL::Memory : public RTLIL::AttrObject +{ + unsigned int hashidx_; + unsigned int hash() const { return hashidx_; } + + Memory(); + + RTLIL::IdString name; + int width, start_offset, size; +}; + +struct RTLIL::Cell : public RTLIL::AttrObject +{ + unsigned int hashidx_; + unsigned int hash() const { return hashidx_; } + +protected: + // use module->addCell() and module->remove() to create or destroy cells + friend struct RTLIL::Module; + Cell(); + +public: + // do not simply copy cells + Cell(RTLIL::Cell &other) = delete; + void operator=(RTLIL::Cell &other) = delete; + + RTLIL::Module *module; + RTLIL::IdString name; + RTLIL::IdString type; + dict connections_; + dict parameters; + + // access cell ports + bool hasPort(RTLIL::IdString portname) const; + void unsetPort(RTLIL::IdString portname); + void setPort(RTLIL::IdString portname, RTLIL::SigSpec signal); + const RTLIL::SigSpec &getPort(RTLIL::IdString portname) const; + const dict &connections() const; + + // information about cell ports + bool known() const; + bool input(RTLIL::IdString portname) const; + bool output(RTLIL::IdString portname) const; + + // access cell parameters + bool hasParam(RTLIL::IdString paramname) const; + void unsetParam(RTLIL::IdString paramname); + void setParam(RTLIL::IdString paramname, RTLIL::Const value); + const RTLIL::Const &getParam(RTLIL::IdString paramname) const; + + void sort(); + void check(); + void fixup_parameters(bool set_a_signed = false, bool set_b_signed = false); + + bool has_keep_attr() const { + return get_bool_attribute("\\keep") || (module && module->design && module->design->module(type) && + module->design->module(type)->get_bool_attribute("\\keep")); + } + + template void rewrite_sigspecs(T functor); +}; + +struct RTLIL::CaseRule +{ + std::vector compare; + std::vector actions; + std::vector switches; + + ~CaseRule(); + void optimize(); + + template void rewrite_sigspecs(T functor); + RTLIL::CaseRule *clone() const; +}; + +struct RTLIL::SwitchRule : public RTLIL::AttrObject +{ + RTLIL::SigSpec signal; + std::vector cases; + + ~SwitchRule(); + + template void rewrite_sigspecs(T functor); + RTLIL::SwitchRule *clone() const; +}; + +struct RTLIL::SyncRule +{ + RTLIL::SyncType type; + RTLIL::SigSpec signal; + std::vector actions; + + template void rewrite_sigspecs(T functor); + RTLIL::SyncRule *clone() const; +}; + +struct RTLIL::Process : public RTLIL::AttrObject +{ + RTLIL::IdString name; + RTLIL::CaseRule root_case; + std::vector syncs; + + ~Process(); + + template void rewrite_sigspecs(T functor); + RTLIL::Process *clone() const; +}; + + +inline RTLIL::SigBit::SigBit() : wire(NULL), data(RTLIL::State::S0) { } +inline RTLIL::SigBit::SigBit(RTLIL::State bit) : wire(NULL), data(bit) { } +inline RTLIL::SigBit::SigBit(bool bit) : wire(NULL), data(bit ? RTLIL::S1 : RTLIL::S0) { } +inline RTLIL::SigBit::SigBit(RTLIL::Wire *wire) : wire(wire), offset(0) { log_assert(wire && wire->width == 1); } +inline RTLIL::SigBit::SigBit(RTLIL::Wire *wire, int offset) : wire(wire), offset(offset) { log_assert(wire != nullptr); } +inline RTLIL::SigBit::SigBit(const RTLIL::SigChunk &chunk) : wire(chunk.wire) { log_assert(chunk.width == 1); if (wire) offset = chunk.offset; else data = chunk.data[0]; } +inline RTLIL::SigBit::SigBit(const RTLIL::SigChunk &chunk, int index) : wire(chunk.wire) { if (wire) offset = chunk.offset + index; else data = chunk.data[index]; } + +inline bool RTLIL::SigBit::operator<(const RTLIL::SigBit &other) const { + if (wire == other.wire) + return wire ? (offset < other.offset) : (data < other.data); + if (wire != nullptr && other.wire != nullptr) + return wire->name < other.wire->name; + return wire < other.wire; +} + +inline bool RTLIL::SigBit::operator==(const RTLIL::SigBit &other) const { + return (wire == other.wire) && (wire ? (offset == other.offset) : (data == other.data)); +} + +inline bool RTLIL::SigBit::operator!=(const RTLIL::SigBit &other) const { + return (wire != other.wire) || (wire ? (offset != other.offset) : (data != other.data)); +} + +inline unsigned int RTLIL::SigBit::hash() const { + if (wire) + return mkhash_add(wire->name.hash(), offset); + return data; +} + +inline RTLIL::SigBit &RTLIL::SigSpecIterator::operator*() const { + return (*sig_p)[index]; +} + +inline const RTLIL::SigBit &RTLIL::SigSpecConstIterator::operator*() const { + return (*sig_p)[index]; +} + +inline RTLIL::SigBit::SigBit(const RTLIL::SigSpec &sig) { + log_assert(sig.size() == 1 && sig.chunks().size() == 1); + *this = SigBit(sig.chunks().front()); +} + +template +void RTLIL::Module::rewrite_sigspecs(T functor) +{ + for (auto &it : cells_) + it.second->rewrite_sigspecs(functor); + for (auto &it : processes) + it.second->rewrite_sigspecs(functor); + for (auto &it : connections_) { + functor(it.first); + functor(it.second); + } +} + +template +void RTLIL::Cell::rewrite_sigspecs(T functor) { + for (auto &it : connections_) + functor(it.second); +} + +template +void RTLIL::CaseRule::rewrite_sigspecs(T functor) { + for (auto &it : compare) + functor(it); + for (auto &it : actions) { + functor(it.first); + functor(it.second); + } + for (auto it : switches) + it->rewrite_sigspecs(functor); +} + +template +void RTLIL::SwitchRule::rewrite_sigspecs(T functor) +{ + functor(signal); + for (auto it : cases) + it->rewrite_sigspecs(functor); +} + +template +void RTLIL::SyncRule::rewrite_sigspecs(T functor) +{ + functor(signal); + for (auto &it : actions) { + functor(it.first); + functor(it.second); + } +} + +template +void RTLIL::Process::rewrite_sigspecs(T functor) +{ + root_case.rewrite_sigspecs(functor); + for (auto it : syncs) + it->rewrite_sigspecs(functor); +} + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/satgen.h b/verilog/windows/autoyosys/share/include/kernel/satgen.h new file mode 100644 index 0000000..690f8e3 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/satgen.h @@ -0,0 +1,1411 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef SATGEN_H +#define SATGEN_H + +#include "kernel/rtlil.h" +#include "kernel/sigtools.h" +#include "kernel/celltypes.h" +#include "kernel/macc.h" + +#include "libs/ezsat/ezminisat.h" + +YOSYS_NAMESPACE_BEGIN + +// defined in kernel/register.cc +extern struct SatSolver *yosys_satsolver_list; +extern struct SatSolver *yosys_satsolver; + +struct SatSolver +{ + string name; + SatSolver *next; + virtual ezSAT *create() = 0; + + SatSolver(string name) : name(name) { + next = yosys_satsolver_list; + yosys_satsolver_list = this; + } + + virtual ~SatSolver() { + auto p = &yosys_satsolver_list; + while (*p) { + if (*p == this) + *p = next; + else + p = &(*p)->next; + } + if (yosys_satsolver == this) + yosys_satsolver = yosys_satsolver_list; + } +}; + +struct ezSatPtr : public std::unique_ptr { + ezSatPtr() : unique_ptr(yosys_satsolver->create()) { } +}; + +struct SatGen +{ + ezSAT *ez; + SigMap *sigmap; + std::string prefix; + SigPool initial_state; + std::map asserts_a, asserts_en; + std::map assumes_a, assumes_en; + std::map> imported_signals; + std::map, bool> initstates; + bool ignore_div_by_zero; + bool model_undef; + + SatGen(ezSAT *ez, SigMap *sigmap, std::string prefix = std::string()) : + ez(ez), sigmap(sigmap), prefix(prefix), ignore_div_by_zero(false), model_undef(false) + { + } + + void setContext(SigMap *sigmap, std::string prefix = std::string()) + { + this->sigmap = sigmap; + this->prefix = prefix; + } + + std::vector importSigSpecWorker(RTLIL::SigSpec sig, std::string &pf, bool undef_mode, bool dup_undef) + { + log_assert(!undef_mode || model_undef); + sigmap->apply(sig); + + std::vector vec; + vec.reserve(GetSize(sig)); + + for (auto &bit : sig) + if (bit.wire == NULL) { + if (model_undef && dup_undef && bit == RTLIL::State::Sx) + vec.push_back(ez->frozen_literal()); + else + vec.push_back(bit == (undef_mode ? RTLIL::State::Sx : RTLIL::State::S1) ? ez->CONST_TRUE : ez->CONST_FALSE); + } else { + std::string name = pf + (bit.wire->width == 1 ? stringf("%s", log_id(bit.wire)) : stringf("%s [%d]", log_id(bit.wire->name), bit.offset)); + vec.push_back(ez->frozen_literal(name)); + imported_signals[pf][bit] = vec.back(); + } + return vec; + } + + std::vector importSigSpec(RTLIL::SigSpec sig, int timestep = -1) + { + log_assert(timestep != 0); + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + return importSigSpecWorker(sig, pf, false, false); + } + + std::vector importDefSigSpec(RTLIL::SigSpec sig, int timestep = -1) + { + log_assert(timestep != 0); + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + return importSigSpecWorker(sig, pf, false, true); + } + + std::vector importUndefSigSpec(RTLIL::SigSpec sig, int timestep = -1) + { + log_assert(timestep != 0); + std::string pf = "undef:" + prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + return importSigSpecWorker(sig, pf, true, false); + } + + int importSigBit(RTLIL::SigBit bit, int timestep = -1) + { + log_assert(timestep != 0); + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + return importSigSpecWorker(bit, pf, false, false).front(); + } + + int importDefSigBit(RTLIL::SigBit bit, int timestep = -1) + { + log_assert(timestep != 0); + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + return importSigSpecWorker(bit, pf, false, true).front(); + } + + int importUndefSigBit(RTLIL::SigBit bit, int timestep = -1) + { + log_assert(timestep != 0); + std::string pf = "undef:" + prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + return importSigSpecWorker(bit, pf, true, false).front(); + } + + bool importedSigBit(RTLIL::SigBit bit, int timestep = -1) + { + log_assert(timestep != 0); + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + return imported_signals[pf].count(bit) != 0; + } + + void getAsserts(RTLIL::SigSpec &sig_a, RTLIL::SigSpec &sig_en, int timestep = -1) + { + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + sig_a = asserts_a[pf]; + sig_en = asserts_en[pf]; + } + + void getAssumes(RTLIL::SigSpec &sig_a, RTLIL::SigSpec &sig_en, int timestep = -1) + { + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + sig_a = assumes_a[pf]; + sig_en = assumes_en[pf]; + } + + int importAsserts(int timestep = -1) + { + std::vector check_bits, enable_bits; + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + if (model_undef) { + check_bits = ez->vec_and(ez->vec_not(importUndefSigSpec(asserts_a[pf], timestep)), importDefSigSpec(asserts_a[pf], timestep)); + enable_bits = ez->vec_and(ez->vec_not(importUndefSigSpec(asserts_en[pf], timestep)), importDefSigSpec(asserts_en[pf], timestep)); + } else { + check_bits = importDefSigSpec(asserts_a[pf], timestep); + enable_bits = importDefSigSpec(asserts_en[pf], timestep); + } + return ez->vec_reduce_and(ez->vec_or(check_bits, ez->vec_not(enable_bits))); + } + + int importAssumes(int timestep = -1) + { + std::vector check_bits, enable_bits; + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + if (model_undef) { + check_bits = ez->vec_and(ez->vec_not(importUndefSigSpec(assumes_a[pf], timestep)), importDefSigSpec(assumes_a[pf], timestep)); + enable_bits = ez->vec_and(ez->vec_not(importUndefSigSpec(assumes_en[pf], timestep)), importDefSigSpec(assumes_en[pf], timestep)); + } else { + check_bits = importDefSigSpec(assumes_a[pf], timestep); + enable_bits = importDefSigSpec(assumes_en[pf], timestep); + } + return ez->vec_reduce_and(ez->vec_or(check_bits, ez->vec_not(enable_bits))); + } + + int signals_eq(RTLIL::SigSpec lhs, RTLIL::SigSpec rhs, int timestep_lhs = -1, int timestep_rhs = -1) + { + if (timestep_rhs < 0) + timestep_rhs = timestep_lhs; + + log_assert(lhs.size() == rhs.size()); + + std::vector vec_lhs = importSigSpec(lhs, timestep_lhs); + std::vector vec_rhs = importSigSpec(rhs, timestep_rhs); + + if (!model_undef) + return ez->vec_eq(vec_lhs, vec_rhs); + + std::vector undef_lhs = importUndefSigSpec(lhs, timestep_lhs); + std::vector undef_rhs = importUndefSigSpec(rhs, timestep_rhs); + + std::vector eq_bits; + for (int i = 0; i < lhs.size(); i++) + eq_bits.push_back(ez->AND(ez->IFF(undef_lhs.at(i), undef_rhs.at(i)), + ez->IFF(ez->OR(vec_lhs.at(i), undef_lhs.at(i)), ez->OR(vec_rhs.at(i), undef_rhs.at(i))))); + return ez->expression(ezSAT::OpAnd, eq_bits); + } + + void extendSignalWidth(std::vector &vec_a, std::vector &vec_b, RTLIL::Cell *cell, size_t y_width = 0, bool forced_signed = false) + { + bool is_signed = forced_signed; + if (!forced_signed && cell->parameters.count("\\A_SIGNED") > 0 && cell->parameters.count("\\B_SIGNED") > 0) + is_signed = cell->parameters["\\A_SIGNED"].as_bool() && cell->parameters["\\B_SIGNED"].as_bool(); + while (vec_a.size() < vec_b.size() || vec_a.size() < y_width) + vec_a.push_back(is_signed && vec_a.size() > 0 ? vec_a.back() : ez->CONST_FALSE); + while (vec_b.size() < vec_a.size() || vec_b.size() < y_width) + vec_b.push_back(is_signed && vec_b.size() > 0 ? vec_b.back() : ez->CONST_FALSE); + } + + void extendSignalWidth(std::vector &vec_a, std::vector &vec_b, std::vector &vec_y, RTLIL::Cell *cell, bool forced_signed = false) + { + extendSignalWidth(vec_a, vec_b, cell, vec_y.size(), forced_signed); + while (vec_y.size() < vec_a.size()) + vec_y.push_back(ez->literal()); + } + + void extendSignalWidthUnary(std::vector &vec_a, std::vector &vec_y, RTLIL::Cell *cell, bool forced_signed = false) + { + bool is_signed = forced_signed || (cell->parameters.count("\\A_SIGNED") > 0 && cell->parameters["\\A_SIGNED"].as_bool()); + while (vec_a.size() < vec_y.size()) + vec_a.push_back(is_signed && vec_a.size() > 0 ? vec_a.back() : ez->CONST_FALSE); + while (vec_y.size() < vec_a.size()) + vec_y.push_back(ez->literal()); + } + + void undefGating(std::vector &vec_y, std::vector &vec_yy, std::vector &vec_undef) + { + log_assert(model_undef); + log_assert(vec_y.size() == vec_yy.size()); + if (vec_y.size() > vec_undef.size()) { + std::vector trunc_y(vec_y.begin(), vec_y.begin() + vec_undef.size()); + std::vector trunc_yy(vec_yy.begin(), vec_yy.begin() + vec_undef.size()); + ez->assume(ez->expression(ezSAT::OpAnd, ez->vec_or(vec_undef, ez->vec_iff(trunc_y, trunc_yy)))); + } else { + log_assert(vec_y.size() == vec_undef.size()); + ez->assume(ez->expression(ezSAT::OpAnd, ez->vec_or(vec_undef, ez->vec_iff(vec_y, vec_yy)))); + } + } + + void undefGating(int y, int yy, int undef) + { + ez->assume(ez->OR(undef, ez->IFF(y, yy))); + } + + void setInitState(int timestep) + { + auto key = make_pair(prefix, timestep); + log_assert(initstates.count(key) == 0 || initstates.at(key) == true); + initstates[key] = true; + } + + bool importCell(RTLIL::Cell *cell, int timestep = -1) + { + bool arith_undef_handled = false; + bool is_arith_compare = cell->type.in("$lt", "$le", "$ge", "$gt"); + + if (model_undef && (cell->type.in("$add", "$sub", "$mul", "$div", "$mod") || is_arith_compare)) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + if (is_arith_compare) + extendSignalWidth(undef_a, undef_b, cell, true); + else + extendSignalWidth(undef_a, undef_b, undef_y, cell, true); + + int undef_any_a = ez->expression(ezSAT::OpOr, undef_a); + int undef_any_b = ez->expression(ezSAT::OpOr, undef_b); + int undef_y_bit = ez->OR(undef_any_a, undef_any_b); + + if (cell->type == "$div" || cell->type == "$mod") { + std::vector b = importSigSpec(cell->getPort("\\B"), timestep); + undef_y_bit = ez->OR(undef_y_bit, ez->NOT(ez->expression(ezSAT::OpOr, b))); + } + + if (is_arith_compare) { + for (size_t i = 1; i < undef_y.size(); i++) + ez->SET(ez->CONST_FALSE, undef_y.at(i)); + ez->SET(undef_y_bit, undef_y.at(0)); + } else { + std::vector undef_y_bits(undef_y.size(), undef_y_bit); + ez->assume(ez->vec_eq(undef_y_bits, undef_y)); + } + + arith_undef_handled = true; + } + + if (cell->type.in("$_AND_", "$_NAND_", "$_OR_", "$_NOR_", "$_XOR_", "$_XNOR_", + "$and", "$or", "$xor", "$xnor", "$add", "$sub")) + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidth(a, b, y, cell); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + + if (cell->type == "$and" || cell->type == "$_AND_") + ez->assume(ez->vec_eq(ez->vec_and(a, b), yy)); + if (cell->type == "$_NAND_") + ez->assume(ez->vec_eq(ez->vec_not(ez->vec_and(a, b)), yy)); + if (cell->type == "$or" || cell->type == "$_OR_") + ez->assume(ez->vec_eq(ez->vec_or(a, b), yy)); + if (cell->type == "$_NOR_") + ez->assume(ez->vec_eq(ez->vec_not(ez->vec_or(a, b)), yy)); + if (cell->type == "$xor" || cell->type == "$_XOR_") + ez->assume(ez->vec_eq(ez->vec_xor(a, b), yy)); + if (cell->type == "$xnor" || cell->type == "$_XNOR_") + ez->assume(ez->vec_eq(ez->vec_not(ez->vec_xor(a, b)), yy)); + if (cell->type == "$add") + ez->assume(ez->vec_eq(ez->vec_add(a, b), yy)); + if (cell->type == "$sub") + ez->assume(ez->vec_eq(ez->vec_sub(a, b), yy)); + + if (model_undef && !arith_undef_handled) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidth(undef_a, undef_b, undef_y, cell, false); + + if (cell->type.in("$and", "$_AND_", "$_NAND_")) { + std::vector a0 = ez->vec_and(ez->vec_not(a), ez->vec_not(undef_a)); + std::vector b0 = ez->vec_and(ez->vec_not(b), ez->vec_not(undef_b)); + std::vector yX = ez->vec_and(ez->vec_or(undef_a, undef_b), ez->vec_not(ez->vec_or(a0, b0))); + ez->assume(ez->vec_eq(yX, undef_y)); + } + else if (cell->type.in("$or", "$_OR_", "$_NOR_")) { + std::vector a1 = ez->vec_and(a, ez->vec_not(undef_a)); + std::vector b1 = ez->vec_and(b, ez->vec_not(undef_b)); + std::vector yX = ez->vec_and(ez->vec_or(undef_a, undef_b), ez->vec_not(ez->vec_or(a1, b1))); + ez->assume(ez->vec_eq(yX, undef_y)); + } + else if (cell->type.in("$xor", "$xnor", "$_XOR_", "$_XNOR_")) { + std::vector yX = ez->vec_or(undef_a, undef_b); + ez->assume(ez->vec_eq(yX, undef_y)); + } + else + log_abort(); + + undefGating(y, yy, undef_y); + } + else if (model_undef) + { + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type.in("$_AOI3_", "$_OAI3_", "$_AOI4_", "$_OAI4_")) + { + bool aoi_mode = cell->type.in("$_AOI3_", "$_AOI4_"); + bool three_mode = cell->type.in("$_AOI3_", "$_OAI3_"); + + int a = importDefSigSpec(cell->getPort("\\A"), timestep).at(0); + int b = importDefSigSpec(cell->getPort("\\B"), timestep).at(0); + int c = importDefSigSpec(cell->getPort("\\C"), timestep).at(0); + int d = three_mode ? (aoi_mode ? ez->CONST_TRUE : ez->CONST_FALSE) : importDefSigSpec(cell->getPort("\\D"), timestep).at(0); + int y = importDefSigSpec(cell->getPort("\\Y"), timestep).at(0); + int yy = model_undef ? ez->literal() : y; + + if (cell->type.in("$_AOI3_", "$_AOI4_")) + ez->assume(ez->IFF(ez->NOT(ez->OR(ez->AND(a, b), ez->AND(c, d))), yy)); + else + ez->assume(ez->IFF(ez->NOT(ez->AND(ez->OR(a, b), ez->OR(c, d))), yy)); + + if (model_undef) + { + int undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep).at(0); + int undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep).at(0); + int undef_c = importUndefSigSpec(cell->getPort("\\C"), timestep).at(0); + int undef_d = three_mode ? ez->CONST_FALSE : importUndefSigSpec(cell->getPort("\\D"), timestep).at(0); + int undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep).at(0); + + if (aoi_mode) + { + int a0 = ez->AND(ez->NOT(a), ez->NOT(undef_a)); + int b0 = ez->AND(ez->NOT(b), ez->NOT(undef_b)); + int c0 = ez->AND(ez->NOT(c), ez->NOT(undef_c)); + int d0 = ez->AND(ez->NOT(d), ez->NOT(undef_d)); + + int ab = ez->AND(a, b), cd = ez->AND(c, d); + int undef_ab = ez->AND(ez->OR(undef_a, undef_b), ez->NOT(ez->OR(a0, b0))); + int undef_cd = ez->AND(ez->OR(undef_c, undef_d), ez->NOT(ez->OR(c0, d0))); + + int ab1 = ez->AND(ab, ez->NOT(undef_ab)); + int cd1 = ez->AND(cd, ez->NOT(undef_cd)); + int yX = ez->AND(ez->OR(undef_ab, undef_cd), ez->NOT(ez->OR(ab1, cd1))); + + ez->assume(ez->IFF(yX, undef_y)); + } + else + { + int a1 = ez->AND(a, ez->NOT(undef_a)); + int b1 = ez->AND(b, ez->NOT(undef_b)); + int c1 = ez->AND(c, ez->NOT(undef_c)); + int d1 = ez->AND(d, ez->NOT(undef_d)); + + int ab = ez->OR(a, b), cd = ez->OR(c, d); + int undef_ab = ez->AND(ez->OR(undef_a, undef_b), ez->NOT(ez->OR(a1, b1))); + int undef_cd = ez->AND(ez->OR(undef_c, undef_d), ez->NOT(ez->OR(c1, d1))); + + int ab0 = ez->AND(ez->NOT(ab), ez->NOT(undef_ab)); + int cd0 = ez->AND(ez->NOT(cd), ez->NOT(undef_cd)); + int yX = ez->AND(ez->OR(undef_ab, undef_cd), ez->NOT(ez->OR(ab0, cd0))); + + ez->assume(ez->IFF(yX, undef_y)); + } + + undefGating(y, yy, undef_y); + } + + return true; + } + + if (cell->type == "$_NOT_" || cell->type == "$not") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidthUnary(a, y, cell); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + ez->assume(ez->vec_eq(ez->vec_not(a), yy)); + + if (model_undef) { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidthUnary(undef_a, undef_y, cell, false); + ez->assume(ez->vec_eq(undef_a, undef_y)); + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$_MUX_" || cell->type == "$mux") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector s = importDefSigSpec(cell->getPort("\\S"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + ez->assume(ez->vec_eq(ez->vec_ite(s.at(0), b, a), yy)); + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_s = importUndefSigSpec(cell->getPort("\\S"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + + std::vector unequal_ab = ez->vec_not(ez->vec_iff(a, b)); + std::vector undef_ab = ez->vec_or(unequal_ab, ez->vec_or(undef_a, undef_b)); + std::vector yX = ez->vec_ite(undef_s.at(0), undef_ab, ez->vec_ite(s.at(0), undef_b, undef_a)); + ez->assume(ez->vec_eq(yX, undef_y)); + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$pmux") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector s = importDefSigSpec(cell->getPort("\\S"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + + std::vector tmp = a; + for (size_t i = 0; i < s.size(); i++) { + std::vector part_of_b(b.begin()+i*a.size(), b.begin()+(i+1)*a.size()); + tmp = ez->vec_ite(s.at(i), part_of_b, tmp); + } + ez->assume(ez->vec_eq(tmp, yy)); + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_s = importUndefSigSpec(cell->getPort("\\S"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + + int maybe_one_hot = ez->CONST_FALSE; + int maybe_many_hot = ez->CONST_FALSE; + + int sure_one_hot = ez->CONST_FALSE; + int sure_many_hot = ez->CONST_FALSE; + + std::vector bits_set = std::vector(undef_y.size(), ez->CONST_FALSE); + std::vector bits_clr = std::vector(undef_y.size(), ez->CONST_FALSE); + + for (size_t i = 0; i < s.size(); i++) + { + std::vector part_of_b(b.begin()+i*a.size(), b.begin()+(i+1)*a.size()); + std::vector part_of_undef_b(undef_b.begin()+i*a.size(), undef_b.begin()+(i+1)*a.size()); + + int maybe_s = ez->OR(s.at(i), undef_s.at(i)); + int sure_s = ez->AND(s.at(i), ez->NOT(undef_s.at(i))); + + maybe_one_hot = ez->OR(maybe_one_hot, maybe_s); + maybe_many_hot = ez->OR(maybe_many_hot, ez->AND(maybe_one_hot, maybe_s)); + + sure_one_hot = ez->OR(sure_one_hot, sure_s); + sure_many_hot = ez->OR(sure_many_hot, ez->AND(sure_one_hot, sure_s)); + + bits_set = ez->vec_ite(maybe_s, ez->vec_or(bits_set, ez->vec_or(bits_set, ez->vec_or(part_of_b, part_of_undef_b))), bits_set); + bits_clr = ez->vec_ite(maybe_s, ez->vec_or(bits_clr, ez->vec_or(bits_clr, ez->vec_or(ez->vec_not(part_of_b), part_of_undef_b))), bits_clr); + } + + int maybe_a = ez->NOT(maybe_one_hot); + + bits_set = ez->vec_ite(maybe_a, ez->vec_or(bits_set, ez->vec_or(bits_set, ez->vec_or(a, undef_a))), bits_set); + bits_clr = ez->vec_ite(maybe_a, ez->vec_or(bits_clr, ez->vec_or(bits_clr, ez->vec_or(ez->vec_not(a), undef_a))), bits_clr); + + ez->assume(ez->vec_eq(ez->vec_not(ez->vec_xor(bits_set, bits_clr)), undef_y)); + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$pos" || cell->type == "$neg") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidthUnary(a, y, cell); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + + if (cell->type == "$pos") { + ez->assume(ez->vec_eq(a, yy)); + } else { + std::vector zero(a.size(), ez->CONST_FALSE); + ez->assume(ez->vec_eq(ez->vec_sub(zero, a), yy)); + } + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidthUnary(undef_a, undef_y, cell); + + if (cell->type == "$pos") { + ez->assume(ez->vec_eq(undef_a, undef_y)); + } else { + int undef_any_a = ez->expression(ezSAT::OpOr, undef_a); + std::vector undef_y_bits(undef_y.size(), undef_any_a); + ez->assume(ez->vec_eq(undef_y_bits, undef_y)); + } + + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$reduce_and" || cell->type == "$reduce_or" || cell->type == "$reduce_xor" || + cell->type == "$reduce_xnor" || cell->type == "$reduce_bool" || cell->type == "$logic_not") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + + if (cell->type == "$reduce_and") + ez->SET(ez->expression(ez->OpAnd, a), yy.at(0)); + if (cell->type == "$reduce_or" || cell->type == "$reduce_bool") + ez->SET(ez->expression(ez->OpOr, a), yy.at(0)); + if (cell->type == "$reduce_xor") + ez->SET(ez->expression(ez->OpXor, a), yy.at(0)); + if (cell->type == "$reduce_xnor") + ez->SET(ez->NOT(ez->expression(ez->OpXor, a)), yy.at(0)); + if (cell->type == "$logic_not") + ez->SET(ez->NOT(ez->expression(ez->OpOr, a)), yy.at(0)); + for (size_t i = 1; i < y.size(); i++) + ez->SET(ez->CONST_FALSE, yy.at(i)); + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + int aX = ez->expression(ezSAT::OpOr, undef_a); + + if (cell->type == "$reduce_and") { + int a0 = ez->expression(ezSAT::OpOr, ez->vec_and(ez->vec_not(a), ez->vec_not(undef_a))); + ez->assume(ez->IFF(ez->AND(ez->NOT(a0), aX), undef_y.at(0))); + } + else if (cell->type == "$reduce_or" || cell->type == "$reduce_bool" || cell->type == "$logic_not") { + int a1 = ez->expression(ezSAT::OpOr, ez->vec_and(a, ez->vec_not(undef_a))); + ez->assume(ez->IFF(ez->AND(ez->NOT(a1), aX), undef_y.at(0))); + } + else if (cell->type == "$reduce_xor" || cell->type == "$reduce_xnor") { + ez->assume(ez->IFF(aX, undef_y.at(0))); + } else + log_abort(); + + for (size_t i = 1; i < undef_y.size(); i++) + ez->SET(ez->CONST_FALSE, undef_y.at(i)); + + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$logic_and" || cell->type == "$logic_or") + { + std::vector vec_a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector vec_b = importDefSigSpec(cell->getPort("\\B"), timestep); + + int a = ez->expression(ez->OpOr, vec_a); + int b = ez->expression(ez->OpOr, vec_b); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + + if (cell->type == "$logic_and") + ez->SET(ez->expression(ez->OpAnd, a, b), yy.at(0)); + else + ez->SET(ez->expression(ez->OpOr, a, b), yy.at(0)); + for (size_t i = 1; i < y.size(); i++) + ez->SET(ez->CONST_FALSE, yy.at(i)); + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + + int a0 = ez->NOT(ez->OR(ez->expression(ezSAT::OpOr, vec_a), ez->expression(ezSAT::OpOr, undef_a))); + int b0 = ez->NOT(ez->OR(ez->expression(ezSAT::OpOr, vec_b), ez->expression(ezSAT::OpOr, undef_b))); + int a1 = ez->expression(ezSAT::OpOr, ez->vec_and(vec_a, ez->vec_not(undef_a))); + int b1 = ez->expression(ezSAT::OpOr, ez->vec_and(vec_b, ez->vec_not(undef_b))); + int aX = ez->expression(ezSAT::OpOr, undef_a); + int bX = ez->expression(ezSAT::OpOr, undef_b); + + if (cell->type == "$logic_and") + ez->SET(ez->AND(ez->OR(aX, bX), ez->NOT(ez->AND(a1, b1)), ez->NOT(a0), ez->NOT(b0)), undef_y.at(0)); + else if (cell->type == "$logic_or") + ez->SET(ez->AND(ez->OR(aX, bX), ez->NOT(ez->AND(a0, b0)), ez->NOT(a1), ez->NOT(b1)), undef_y.at(0)); + else + log_abort(); + + for (size_t i = 1; i < undef_y.size(); i++) + ez->SET(ez->CONST_FALSE, undef_y.at(i)); + + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$lt" || cell->type == "$le" || cell->type == "$eq" || cell->type == "$ne" || cell->type == "$eqx" || cell->type == "$nex" || cell->type == "$ge" || cell->type == "$gt") + { + bool is_signed = cell->parameters["\\A_SIGNED"].as_bool() && cell->parameters["\\B_SIGNED"].as_bool(); + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidth(a, b, cell); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + + if (model_undef && (cell->type == "$eqx" || cell->type == "$nex")) { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + extendSignalWidth(undef_a, undef_b, cell, true); + a = ez->vec_or(a, undef_a); + b = ez->vec_or(b, undef_b); + } + + if (cell->type == "$lt") + ez->SET(is_signed ? ez->vec_lt_signed(a, b) : ez->vec_lt_unsigned(a, b), yy.at(0)); + if (cell->type == "$le") + ez->SET(is_signed ? ez->vec_le_signed(a, b) : ez->vec_le_unsigned(a, b), yy.at(0)); + if (cell->type == "$eq" || cell->type == "$eqx") + ez->SET(ez->vec_eq(a, b), yy.at(0)); + if (cell->type == "$ne" || cell->type == "$nex") + ez->SET(ez->vec_ne(a, b), yy.at(0)); + if (cell->type == "$ge") + ez->SET(is_signed ? ez->vec_ge_signed(a, b) : ez->vec_ge_unsigned(a, b), yy.at(0)); + if (cell->type == "$gt") + ez->SET(is_signed ? ez->vec_gt_signed(a, b) : ez->vec_gt_unsigned(a, b), yy.at(0)); + for (size_t i = 1; i < y.size(); i++) + ez->SET(ez->CONST_FALSE, yy.at(i)); + + if (model_undef && (cell->type == "$eqx" || cell->type == "$nex")) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidth(undef_a, undef_b, cell, true); + + if (cell->type == "$eqx") + yy.at(0) = ez->AND(yy.at(0), ez->vec_eq(undef_a, undef_b)); + else + yy.at(0) = ez->OR(yy.at(0), ez->vec_ne(undef_a, undef_b)); + + for (size_t i = 0; i < y.size(); i++) + ez->SET(ez->CONST_FALSE, undef_y.at(i)); + + ez->assume(ez->vec_eq(y, yy)); + } + else if (model_undef && (cell->type == "$eq" || cell->type == "$ne")) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidth(undef_a, undef_b, cell, true); + + int undef_any_a = ez->expression(ezSAT::OpOr, undef_a); + int undef_any_b = ez->expression(ezSAT::OpOr, undef_b); + int undef_any = ez->OR(undef_any_a, undef_any_b); + + std::vector masked_a_bits = ez->vec_or(a, ez->vec_or(undef_a, undef_b)); + std::vector masked_b_bits = ez->vec_or(b, ez->vec_or(undef_a, undef_b)); + + int masked_ne = ez->vec_ne(masked_a_bits, masked_b_bits); + int undef_y_bit = ez->AND(undef_any, ez->NOT(masked_ne)); + + for (size_t i = 1; i < undef_y.size(); i++) + ez->SET(ez->CONST_FALSE, undef_y.at(i)); + ez->SET(undef_y_bit, undef_y.at(0)); + + undefGating(y, yy, undef_y); + } + else + { + if (model_undef) { + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + undefGating(y, yy, undef_y); + } + log_assert(!model_undef || arith_undef_handled); + } + return true; + } + + if (cell->type == "$shl" || cell->type == "$shr" || cell->type == "$sshl" || cell->type == "$sshr" || cell->type == "$shift" || cell->type == "$shiftx") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + + int extend_bit = ez->CONST_FALSE; + + if (!cell->type.in("$shift", "$shiftx") && cell->parameters["\\A_SIGNED"].as_bool()) + extend_bit = a.back(); + + while (y.size() < a.size()) + y.push_back(ez->literal()); + while (y.size() > a.size()) + a.push_back(extend_bit); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + std::vector shifted_a; + + if (cell->type == "$shl" || cell->type == "$sshl") + shifted_a = ez->vec_shift_left(a, b, false, ez->CONST_FALSE, ez->CONST_FALSE); + + if (cell->type == "$shr") + shifted_a = ez->vec_shift_right(a, b, false, ez->CONST_FALSE, ez->CONST_FALSE); + + if (cell->type == "$sshr") + shifted_a = ez->vec_shift_right(a, b, false, cell->parameters["\\A_SIGNED"].as_bool() ? a.back() : ez->CONST_FALSE, ez->CONST_FALSE); + + if (cell->type == "$shift" || cell->type == "$shiftx") + shifted_a = ez->vec_shift_right(a, b, cell->parameters["\\B_SIGNED"].as_bool(), ez->CONST_FALSE, ez->CONST_FALSE); + + ez->assume(ez->vec_eq(shifted_a, yy)); + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + std::vector undef_a_shifted; + + extend_bit = cell->type == "$shiftx" ? ez->CONST_TRUE : ez->CONST_FALSE; + if (!cell->type.in("$shift", "$shiftx") && cell->parameters["\\A_SIGNED"].as_bool()) + extend_bit = undef_a.back(); + + while (undef_y.size() < undef_a.size()) + undef_y.push_back(ez->literal()); + while (undef_y.size() > undef_a.size()) + undef_a.push_back(extend_bit); + + if (cell->type == "$shl" || cell->type == "$sshl") + undef_a_shifted = ez->vec_shift_left(undef_a, b, false, ez->CONST_FALSE, ez->CONST_FALSE); + + if (cell->type == "$shr") + undef_a_shifted = ez->vec_shift_right(undef_a, b, false, ez->CONST_FALSE, ez->CONST_FALSE); + + if (cell->type == "$sshr") + undef_a_shifted = ez->vec_shift_right(undef_a, b, false, cell->parameters["\\A_SIGNED"].as_bool() ? undef_a.back() : ez->CONST_FALSE, ez->CONST_FALSE); + + if (cell->type == "$shift") + undef_a_shifted = ez->vec_shift_right(undef_a, b, cell->parameters["\\B_SIGNED"].as_bool(), ez->CONST_FALSE, ez->CONST_FALSE); + + if (cell->type == "$shiftx") + undef_a_shifted = ez->vec_shift_right(undef_a, b, cell->parameters["\\B_SIGNED"].as_bool(), ez->CONST_TRUE, ez->CONST_TRUE); + + int undef_any_b = ez->expression(ezSAT::OpOr, undef_b); + std::vector undef_all_y_bits(undef_y.size(), undef_any_b); + ez->assume(ez->vec_eq(ez->vec_or(undef_a_shifted, undef_all_y_bits), undef_y)); + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$mul") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidth(a, b, y, cell); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + + std::vector tmp(a.size(), ez->CONST_FALSE); + for (int i = 0; i < int(a.size()); i++) + { + std::vector shifted_a(a.size(), ez->CONST_FALSE); + for (int j = i; j < int(a.size()); j++) + shifted_a.at(j) = a.at(j-i); + tmp = ez->vec_ite(b.at(i), ez->vec_add(tmp, shifted_a), tmp); + } + ez->assume(ez->vec_eq(tmp, yy)); + + if (model_undef) { + log_assert(arith_undef_handled); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$macc") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + + Macc macc; + macc.from_cell(cell); + + std::vector tmp(GetSize(y), ez->CONST_FALSE); + + for (auto &port : macc.ports) + { + std::vector in_a = importDefSigSpec(port.in_a, timestep); + std::vector in_b = importDefSigSpec(port.in_b, timestep); + + while (GetSize(in_a) < GetSize(y)) + in_a.push_back(port.is_signed && !in_a.empty() ? in_a.back() : ez->CONST_FALSE); + in_a.resize(GetSize(y)); + + if (GetSize(in_b)) + { + while (GetSize(in_b) < GetSize(y)) + in_b.push_back(port.is_signed && !in_b.empty() ? in_b.back() : ez->CONST_FALSE); + in_b.resize(GetSize(y)); + + for (int i = 0; i < GetSize(in_b); i++) { + std::vector shifted_a(in_a.size(), ez->CONST_FALSE); + for (int j = i; j < int(in_a.size()); j++) + shifted_a.at(j) = in_a.at(j-i); + if (port.do_subtract) + tmp = ez->vec_ite(in_b.at(i), ez->vec_sub(tmp, shifted_a), tmp); + else + tmp = ez->vec_ite(in_b.at(i), ez->vec_add(tmp, shifted_a), tmp); + } + } + else + { + if (port.do_subtract) + tmp = ez->vec_sub(tmp, in_a); + else + tmp = ez->vec_add(tmp, in_a); + } + } + + for (int i = 0; i < GetSize(b); i++) { + std::vector val(GetSize(y), ez->CONST_FALSE); + val.at(0) = b.at(i); + tmp = ez->vec_add(tmp, val); + } + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + + int undef_any_a = ez->expression(ezSAT::OpOr, undef_a); + int undef_any_b = ez->expression(ezSAT::OpOr, undef_b); + + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + ez->assume(ez->vec_eq(undef_y, std::vector(GetSize(y), ez->OR(undef_any_a, undef_any_b)))); + + undefGating(y, tmp, undef_y); + } + else + ez->assume(ez->vec_eq(y, tmp)); + + return true; + } + + if (cell->type == "$div" || cell->type == "$mod") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidth(a, b, y, cell); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + + std::vector a_u, b_u; + if (cell->parameters["\\A_SIGNED"].as_bool() && cell->parameters["\\B_SIGNED"].as_bool()) { + a_u = ez->vec_ite(a.back(), ez->vec_neg(a), a); + b_u = ez->vec_ite(b.back(), ez->vec_neg(b), b); + } else { + a_u = a; + b_u = b; + } + + std::vector chain_buf = a_u; + std::vector y_u(a_u.size(), ez->CONST_FALSE); + for (int i = int(a.size())-1; i >= 0; i--) + { + chain_buf.insert(chain_buf.end(), chain_buf.size(), ez->CONST_FALSE); + + std::vector b_shl(i, ez->CONST_FALSE); + b_shl.insert(b_shl.end(), b_u.begin(), b_u.end()); + b_shl.insert(b_shl.end(), chain_buf.size()-b_shl.size(), ez->CONST_FALSE); + + y_u.at(i) = ez->vec_ge_unsigned(chain_buf, b_shl); + chain_buf = ez->vec_ite(y_u.at(i), ez->vec_sub(chain_buf, b_shl), chain_buf); + + chain_buf.erase(chain_buf.begin() + a_u.size(), chain_buf.end()); + } + + std::vector y_tmp = ignore_div_by_zero ? yy : ez->vec_var(y.size()); + if (cell->type == "$div") { + if (cell->parameters["\\A_SIGNED"].as_bool() && cell->parameters["\\B_SIGNED"].as_bool()) + ez->assume(ez->vec_eq(y_tmp, ez->vec_ite(ez->XOR(a.back(), b.back()), ez->vec_neg(y_u), y_u))); + else + ez->assume(ez->vec_eq(y_tmp, y_u)); + } else { + if (cell->parameters["\\A_SIGNED"].as_bool() && cell->parameters["\\B_SIGNED"].as_bool()) + ez->assume(ez->vec_eq(y_tmp, ez->vec_ite(a.back(), ez->vec_neg(chain_buf), chain_buf))); + else + ez->assume(ez->vec_eq(y_tmp, chain_buf)); + } + + if (ignore_div_by_zero) { + ez->assume(ez->expression(ezSAT::OpOr, b)); + } else { + std::vector div_zero_result; + if (cell->type == "$div") { + if (cell->parameters["\\A_SIGNED"].as_bool() && cell->parameters["\\B_SIGNED"].as_bool()) { + std::vector all_ones(y.size(), ez->CONST_TRUE); + std::vector only_first_one(y.size(), ez->CONST_FALSE); + only_first_one.at(0) = ez->CONST_TRUE; + div_zero_result = ez->vec_ite(a.back(), only_first_one, all_ones); + } else { + div_zero_result.insert(div_zero_result.end(), cell->getPort("\\A").size(), ez->CONST_TRUE); + div_zero_result.insert(div_zero_result.end(), y.size() - div_zero_result.size(), ez->CONST_FALSE); + } + } else { + int copy_a_bits = min(cell->getPort("\\A").size(), cell->getPort("\\B").size()); + div_zero_result.insert(div_zero_result.end(), a.begin(), a.begin() + copy_a_bits); + if (cell->parameters["\\A_SIGNED"].as_bool() && cell->parameters["\\B_SIGNED"].as_bool()) + div_zero_result.insert(div_zero_result.end(), y.size() - div_zero_result.size(), div_zero_result.back()); + else + div_zero_result.insert(div_zero_result.end(), y.size() - div_zero_result.size(), ez->CONST_FALSE); + } + ez->assume(ez->vec_eq(yy, ez->vec_ite(ez->expression(ezSAT::OpOr, b), y_tmp, div_zero_result))); + } + + if (model_undef) { + log_assert(arith_undef_handled); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$lut") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + + std::vector lut; + for (auto bit : cell->getParam("\\LUT").bits) + lut.push_back(bit == RTLIL::S1 ? ez->CONST_TRUE : ez->CONST_FALSE); + while (GetSize(lut) < (1 << GetSize(a))) + lut.push_back(ez->CONST_FALSE); + lut.resize(1 << GetSize(a)); + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector t(lut), u(GetSize(t), ez->CONST_FALSE); + + for (int i = GetSize(a)-1; i >= 0; i--) + { + std::vector t0(t.begin(), t.begin() + GetSize(t)/2); + std::vector t1(t.begin() + GetSize(t)/2, t.end()); + + std::vector u0(u.begin(), u.begin() + GetSize(u)/2); + std::vector u1(u.begin() + GetSize(u)/2, u.end()); + + t = ez->vec_ite(a[i], t1, t0); + u = ez->vec_ite(undef_a[i], ez->vec_or(ez->vec_xor(t0, t1), ez->vec_or(u0, u1)), ez->vec_ite(a[i], u1, u0)); + } + + log_assert(GetSize(t) == 1); + log_assert(GetSize(u) == 1); + undefGating(y, t, u); + ez->assume(ez->vec_eq(importUndefSigSpec(cell->getPort("\\Y"), timestep), u)); + } + else + { + std::vector t = lut; + for (int i = GetSize(a)-1; i >= 0; i--) + { + std::vector t0(t.begin(), t.begin() + GetSize(t)/2); + std::vector t1(t.begin() + GetSize(t)/2, t.end()); + t = ez->vec_ite(a[i], t1, t0); + } + + log_assert(GetSize(t) == 1); + ez->assume(ez->vec_eq(y, t)); + } + return true; + } + + if (cell->type == "$sop") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + int y = importDefSigSpec(cell->getPort("\\Y"), timestep).at(0); + + int width = cell->getParam("\\WIDTH").as_int(); + int depth = cell->getParam("\\DEPTH").as_int(); + + vector table_raw = cell->getParam("\\TABLE").bits; + while (GetSize(table_raw) < 2*width*depth) + table_raw.push_back(State::S0); + + vector> table(depth); + + for (int i = 0; i < depth; i++) + for (int j = 0; j < width; j++) + { + bool pat0 = (table_raw[2*width*i + 2*j + 0] == State::S1); + bool pat1 = (table_raw[2*width*i + 2*j + 1] == State::S1); + + if (pat0 && !pat1) + table.at(i).push_back(0); + else if (!pat0 && pat1) + table.at(i).push_back(1); + else + table.at(i).push_back(-1); + } + + if (model_undef) + { + std::vector products, undef_products; + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + int undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep).at(0); + + for (int i = 0; i < depth; i++) + { + std::vector cmp_a, cmp_ua, cmp_b; + + for (int j = 0; j < width; j++) + if (table.at(i).at(j) >= 0) { + cmp_a.push_back(a.at(j)); + cmp_ua.push_back(undef_a.at(j)); + cmp_b.push_back(table.at(i).at(j) ? ez->CONST_TRUE : ez->CONST_FALSE); + } + + std::vector masked_a = ez->vec_or(cmp_a, cmp_ua); + std::vector masked_b = ez->vec_or(cmp_b, cmp_ua); + + int masked_eq = ez->vec_eq(masked_a, masked_b); + int any_undef = ez->expression(ezSAT::OpOr, cmp_ua); + + undef_products.push_back(ez->AND(any_undef, masked_eq)); + products.push_back(ez->AND(ez->NOT(any_undef), masked_eq)); + } + + int yy = ez->expression(ezSAT::OpOr, products); + ez->SET(undef_y, ez->AND(ez->NOT(yy), ez->expression(ezSAT::OpOr, undef_products))); + undefGating(y, yy, undef_y); + } + else + { + std::vector products; + + for (int i = 0; i < depth; i++) + { + std::vector cmp_a, cmp_b; + + for (int j = 0; j < width; j++) + if (table.at(i).at(j) >= 0) { + cmp_a.push_back(a.at(j)); + cmp_b.push_back(table.at(i).at(j) ? ez->CONST_TRUE : ez->CONST_FALSE); + } + + products.push_back(ez->vec_eq(cmp_a, cmp_b)); + } + + ez->SET(y, ez->expression(ezSAT::OpOr, products)); + } + + return true; + } + + if (cell->type == "$fa") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector c = importDefSigSpec(cell->getPort("\\C"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + std::vector x = importDefSigSpec(cell->getPort("\\X"), timestep); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + std::vector xx = model_undef ? ez->vec_var(x.size()) : x; + + std::vector t1 = ez->vec_xor(a, b); + ez->assume(ez->vec_eq(yy, ez->vec_xor(t1, c))); + + std::vector t2 = ez->vec_and(a, b); + std::vector t3 = ez->vec_and(c, t1); + ez->assume(ez->vec_eq(xx, ez->vec_or(t2, t3))); + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_c = importUndefSigSpec(cell->getPort("\\C"), timestep); + + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + std::vector undef_x = importUndefSigSpec(cell->getPort("\\X"), timestep); + + ez->assume(ez->vec_eq(undef_y, ez->vec_or(ez->vec_or(undef_a, undef_b), undef_c))); + ez->assume(ez->vec_eq(undef_x, undef_y)); + + undefGating(y, yy, undef_y); + undefGating(x, xx, undef_x); + } + return true; + } + + if (cell->type == "$lcu") + { + std::vector p = importDefSigSpec(cell->getPort("\\P"), timestep); + std::vector g = importDefSigSpec(cell->getPort("\\G"), timestep); + std::vector ci = importDefSigSpec(cell->getPort("\\CI"), timestep); + std::vector co = importDefSigSpec(cell->getPort("\\CO"), timestep); + + std::vector yy = model_undef ? ez->vec_var(co.size()) : co; + + for (int i = 0; i < GetSize(co); i++) + ez->SET(yy[i], ez->OR(g[i], ez->AND(p[i], i ? yy[i-1] : ci[0]))); + + if (model_undef) + { + std::vector undef_p = importUndefSigSpec(cell->getPort("\\P"), timestep); + std::vector undef_g = importUndefSigSpec(cell->getPort("\\G"), timestep); + std::vector undef_ci = importUndefSigSpec(cell->getPort("\\CI"), timestep); + std::vector undef_co = importUndefSigSpec(cell->getPort("\\CO"), timestep); + + int undef_any_p = ez->expression(ezSAT::OpOr, undef_p); + int undef_any_g = ez->expression(ezSAT::OpOr, undef_g); + int undef_any_ci = ez->expression(ezSAT::OpOr, undef_ci); + int undef_co_bit = ez->OR(undef_any_p, undef_any_g, undef_any_ci); + + std::vector undef_co_bits(undef_co.size(), undef_co_bit); + ez->assume(ez->vec_eq(undef_co_bits, undef_co)); + + undefGating(co, yy, undef_co); + } + return true; + } + + if (cell->type == "$alu") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector b = importDefSigSpec(cell->getPort("\\B"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + std::vector x = importDefSigSpec(cell->getPort("\\X"), timestep); + std::vector ci = importDefSigSpec(cell->getPort("\\CI"), timestep); + std::vector bi = importDefSigSpec(cell->getPort("\\BI"), timestep); + std::vector co = importDefSigSpec(cell->getPort("\\CO"), timestep); + + extendSignalWidth(a, b, y, cell); + extendSignalWidth(a, b, x, cell); + extendSignalWidth(a, b, co, cell); + + std::vector def_y = model_undef ? ez->vec_var(y.size()) : y; + std::vector def_x = model_undef ? ez->vec_var(x.size()) : x; + std::vector def_co = model_undef ? ez->vec_var(co.size()) : co; + + log_assert(GetSize(y) == GetSize(x)); + log_assert(GetSize(y) == GetSize(co)); + log_assert(GetSize(ci) == 1); + log_assert(GetSize(bi) == 1); + + for (int i = 0; i < GetSize(y); i++) + { + int s1 = a.at(i), s2 = ez->XOR(b.at(i), bi.at(0)), s3 = i ? co.at(i-1) : ci.at(0); + ez->SET(def_x.at(i), ez->XOR(s1, s2)); + ez->SET(def_y.at(i), ez->XOR(def_x.at(i), s3)); + ez->SET(def_co.at(i), ez->OR(ez->AND(s1, s2), ez->AND(s1, s3), ez->AND(s2, s3))); + } + + if (model_undef) + { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_b = importUndefSigSpec(cell->getPort("\\B"), timestep); + std::vector undef_ci = importUndefSigSpec(cell->getPort("\\CI"), timestep); + std::vector undef_bi = importUndefSigSpec(cell->getPort("\\BI"), timestep); + + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + std::vector undef_x = importUndefSigSpec(cell->getPort("\\X"), timestep); + std::vector undef_co = importUndefSigSpec(cell->getPort("\\CO"), timestep); + + extendSignalWidth(undef_a, undef_b, undef_y, cell); + extendSignalWidth(undef_a, undef_b, undef_x, cell); + extendSignalWidth(undef_a, undef_b, undef_co, cell); + + std::vector all_inputs_undef; + all_inputs_undef.insert(all_inputs_undef.end(), undef_a.begin(), undef_a.end()); + all_inputs_undef.insert(all_inputs_undef.end(), undef_b.begin(), undef_b.end()); + all_inputs_undef.insert(all_inputs_undef.end(), undef_ci.begin(), undef_ci.end()); + all_inputs_undef.insert(all_inputs_undef.end(), undef_bi.begin(), undef_bi.end()); + int undef_any = ez->expression(ezSAT::OpOr, all_inputs_undef); + + for (int i = 0; i < GetSize(undef_y); i++) { + ez->SET(undef_y.at(i), undef_any); + ez->SET(undef_x.at(i), ez->OR(undef_a.at(i), undef_b.at(i), undef_bi.at(0))); + ez->SET(undef_co.at(i), undef_any); + } + + undefGating(y, def_y, undef_y); + undefGating(x, def_x, undef_x); + undefGating(co, def_co, undef_co); + } + return true; + } + + if (cell->type == "$slice") + { + RTLIL::SigSpec a = cell->getPort("\\A"); + RTLIL::SigSpec y = cell->getPort("\\Y"); + ez->assume(signals_eq(a.extract(cell->parameters.at("\\OFFSET").as_int(), y.size()), y, timestep)); + return true; + } + + if (cell->type == "$concat") + { + RTLIL::SigSpec a = cell->getPort("\\A"); + RTLIL::SigSpec b = cell->getPort("\\B"); + RTLIL::SigSpec y = cell->getPort("\\Y"); + + RTLIL::SigSpec ab = a; + ab.append(b); + + ez->assume(signals_eq(ab, y, timestep)); + return true; + } + + if (timestep > 0 && cell->type.in("$ff", "$dff", "$_FF_", "$_DFF_N_", "$_DFF_P_")) + { + if (timestep == 1) + { + initial_state.add((*sigmap)(cell->getPort("\\Q"))); + } + else + { + std::vector d = importDefSigSpec(cell->getPort("\\D"), timestep-1); + std::vector q = importDefSigSpec(cell->getPort("\\Q"), timestep); + + std::vector qq = model_undef ? ez->vec_var(q.size()) : q; + ez->assume(ez->vec_eq(d, qq)); + + if (model_undef) + { + std::vector undef_d = importUndefSigSpec(cell->getPort("\\D"), timestep-1); + std::vector undef_q = importUndefSigSpec(cell->getPort("\\Q"), timestep); + + ez->assume(ez->vec_eq(undef_d, undef_q)); + undefGating(q, qq, undef_q); + } + } + return true; + } + + if (cell->type == "$anyconst") + { + if (timestep < 2) + return true; + + std::vector d = importDefSigSpec(cell->getPort("\\Y"), timestep-1); + std::vector q = importDefSigSpec(cell->getPort("\\Y"), timestep); + + std::vector qq = model_undef ? ez->vec_var(q.size()) : q; + ez->assume(ez->vec_eq(d, qq)); + + if (model_undef) + { + std::vector undef_d = importUndefSigSpec(cell->getPort("\\Y"), timestep-1); + std::vector undef_q = importUndefSigSpec(cell->getPort("\\Y"), timestep); + + ez->assume(ez->vec_eq(undef_d, undef_q)); + undefGating(q, qq, undef_q); + } + return true; + } + + if (cell->type == "$anyseq") + { + return true; + } + + if (cell->type == "$_BUF_" || cell->type == "$equiv") + { + std::vector a = importDefSigSpec(cell->getPort("\\A"), timestep); + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidthUnary(a, y, cell); + + std::vector yy = model_undef ? ez->vec_var(y.size()) : y; + ez->assume(ez->vec_eq(a, yy)); + + if (model_undef) { + std::vector undef_a = importUndefSigSpec(cell->getPort("\\A"), timestep); + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + extendSignalWidthUnary(undef_a, undef_y, cell, false); + ez->assume(ez->vec_eq(undef_a, undef_y)); + undefGating(y, yy, undef_y); + } + return true; + } + + if (cell->type == "$initstate") + { + auto key = make_pair(prefix, timestep); + if (initstates.count(key) == 0) + initstates[key] = false; + + std::vector y = importDefSigSpec(cell->getPort("\\Y"), timestep); + log_assert(GetSize(y) == 1); + ez->SET(y[0], initstates[key] ? ez->CONST_TRUE : ez->CONST_FALSE); + + if (model_undef) { + std::vector undef_y = importUndefSigSpec(cell->getPort("\\Y"), timestep); + log_assert(GetSize(undef_y) == 1); + ez->SET(undef_y[0], ez->CONST_FALSE); + } + + return true; + } + + if (cell->type == "$assert") + { + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + asserts_a[pf].append((*sigmap)(cell->getPort("\\A"))); + asserts_en[pf].append((*sigmap)(cell->getPort("\\EN"))); + return true; + } + + if (cell->type == "$assume") + { + std::string pf = prefix + (timestep == -1 ? "" : stringf("@%d:", timestep)); + assumes_a[pf].append((*sigmap)(cell->getPort("\\A"))); + assumes_en[pf].append((*sigmap)(cell->getPort("\\EN"))); + return true; + } + + // Unsupported internal cell types: $pow $lut + // .. and all sequential cells except $dff and $_DFF_[NP]_ + return false; + } +}; + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/sigtools.h b/verilog/windows/autoyosys/share/include/kernel/sigtools.h new file mode 100644 index 0000000..4e97bb7 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/sigtools.h @@ -0,0 +1,332 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef SIGTOOLS_H +#define SIGTOOLS_H + +#include "kernel/yosys.h" + +YOSYS_NAMESPACE_BEGIN + +struct SigPool +{ + struct bitDef_t : public std::pair { + bitDef_t() : std::pair(NULL, 0) { } + bitDef_t(const RTLIL::SigBit &bit) : std::pair(bit.wire, bit.offset) { } + unsigned int hash() const { return first->name.hash() + second; } + }; + + pool bits; + + void clear() + { + bits.clear(); + } + + void add(RTLIL::SigSpec sig) + { + for (auto &bit : sig) + if (bit.wire != NULL) + bits.insert(bit); + } + + void add(const SigPool &other) + { + for (auto &bit : other.bits) + bits.insert(bit); + } + + void del(RTLIL::SigSpec sig) + { + for (auto &bit : sig) + if (bit.wire != NULL) + bits.erase(bit); + } + + void del(const SigPool &other) + { + for (auto &bit : other.bits) + bits.erase(bit); + } + + void expand(RTLIL::SigSpec from, RTLIL::SigSpec to) + { + log_assert(GetSize(from) == GetSize(to)); + for (int i = 0; i < GetSize(from); i++) { + bitDef_t bit_from(from[i]), bit_to(to[i]); + if (bit_from.first != NULL && bit_to.first != NULL && bits.count(bit_from) > 0) + bits.insert(bit_to); + } + } + + RTLIL::SigSpec extract(RTLIL::SigSpec sig) + { + RTLIL::SigSpec result; + for (auto &bit : sig) + if (bit.wire != NULL && bits.count(bit)) + result.append_bit(bit); + return result; + } + + RTLIL::SigSpec remove(RTLIL::SigSpec sig) + { + RTLIL::SigSpec result; + for (auto &bit : sig) + if (bit.wire != NULL && bits.count(bit) == 0) + result.append(bit); + return result; + } + + bool check(RTLIL::SigBit bit) + { + return bit.wire != NULL && bits.count(bit); + } + + bool check_any(RTLIL::SigSpec sig) + { + for (auto &bit : sig) + if (bit.wire != NULL && bits.count(bit)) + return true; + return false; + } + + bool check_all(RTLIL::SigSpec sig) + { + for (auto &bit : sig) + if (bit.wire != NULL && bits.count(bit) == 0) + return false; + return true; + } + + RTLIL::SigSpec export_one() + { + for (auto &bit : bits) + return RTLIL::SigSpec(bit.first, bit.second); + return RTLIL::SigSpec(); + } + + RTLIL::SigSpec export_all() + { + pool sig; + for (auto &bit : bits) + sig.insert(RTLIL::SigBit(bit.first, bit.second)); + return sig; + } + + size_t size() const + { + return bits.size(); + } +}; + +template > +struct SigSet +{ + struct bitDef_t : public std::pair { + bitDef_t() : std::pair(NULL, 0) { } + bitDef_t(const RTLIL::SigBit &bit) : std::pair(bit.wire, bit.offset) { } + unsigned int hash() const { return first->name.hash() + second; } + }; + + dict> bits; + + void clear() + { + bits.clear(); + } + + void insert(RTLIL::SigSpec sig, T data) + { + for (auto &bit : sig) + if (bit.wire != NULL) + bits[bit].insert(data); + } + + void insert(RTLIL::SigSpec sig, const std::set &data) + { + for (auto &bit : sig) + if (bit.wire != NULL) + bits[bit].insert(data.begin(), data.end()); + } + + void erase(RTLIL::SigSpec sig) + { + for (auto &bit : sig) + if (bit.wire != NULL) + bits[bit].clear(); + } + + void erase(RTLIL::SigSpec sig, T data) + { + for (auto &bit : sig) + if (bit.wire != NULL) + bits[bit].erase(data); + } + + void erase(RTLIL::SigSpec sig, const std::set &data) + { + for (auto &bit : sig) + if (bit.wire != NULL) + bits[bit].erase(data.begin(), data.end()); + } + + void find(RTLIL::SigSpec sig, std::set &result) + { + for (auto &bit : sig) + if (bit.wire != NULL) { + auto &data = bits[bit]; + result.insert(data.begin(), data.end()); + } + } + + void find(RTLIL::SigSpec sig, pool &result) + { + for (auto &bit : sig) + if (bit.wire != NULL) { + auto &data = bits[bit]; + result.insert(data.begin(), data.end()); + } + } + + std::set find(RTLIL::SigSpec sig) + { + std::set result; + find(sig, result); + return result; + } + + bool has(RTLIL::SigSpec sig) + { + for (auto &bit : sig) + if (bit.wire != NULL && bits.count(bit)) + return true; + return false; + } +}; + +struct SigMap +{ + mfp database; + + SigMap(RTLIL::Module *module = NULL) + { + if (module != NULL) + set(module); + } + + void swap(SigMap &other) + { + database.swap(other.database); + } + + void clear() + { + database.clear(); + } + + void set(RTLIL::Module *module) + { + int bitcount = 0; + for (auto &it : module->connections()) + bitcount += it.first.size(); + + database.clear(); + database.reserve(bitcount); + + for (auto &it : module->connections()) + add(it.first, it.second); + } + + void add(RTLIL::SigSpec from, RTLIL::SigSpec to) + { + log_assert(GetSize(from) == GetSize(to)); + + for (int i = 0; i < GetSize(from); i++) + { + int bfi = database.lookup(from[i]); + int bti = database.lookup(to[i]); + + const RTLIL::SigBit &bf = database[bfi]; + const RTLIL::SigBit &bt = database[bti]; + + if (bf.wire || bt.wire) + { + database.imerge(bfi, bti); + + if (bf.wire == nullptr) + database.ipromote(bfi); + + if (bt.wire == nullptr) + database.ipromote(bti); + } + } + } + + void add(RTLIL::SigSpec sig) + { + for (auto &bit : sig) { + RTLIL::SigBit b = database.find(bit); + if (b.wire != nullptr) + database.promote(bit); + } + } + + void apply(RTLIL::SigBit &bit) const + { + bit = database.find(bit); + } + + void apply(RTLIL::SigSpec &sig) const + { + for (auto &bit : sig) + apply(bit); + } + + RTLIL::SigBit operator()(RTLIL::SigBit bit) const + { + apply(bit); + return bit; + } + + RTLIL::SigSpec operator()(RTLIL::SigSpec sig) const + { + apply(sig); + return sig; + } + + RTLIL::SigSpec operator()(RTLIL::Wire *wire) const + { + SigSpec sig(wire); + apply(sig); + return sig; + } + + RTLIL::SigSpec allbits() const + { + RTLIL::SigSpec sig; + for (auto &bit : database) + if (bit.wire != nullptr) + sig.append(bit); + return sig; + } +}; + +YOSYS_NAMESPACE_END + +#endif /* SIGTOOLS_H */ diff --git a/verilog/windows/autoyosys/share/include/kernel/utils.h b/verilog/windows/autoyosys/share/include/kernel/utils.h new file mode 100644 index 0000000..8942905 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/utils.h @@ -0,0 +1,214 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +// This file contains various c++ utility routines and helper classes that +// do not depend on any other components of yosys (except stuff like log_*). + +#include "kernel/yosys.h" + +#ifndef UTILS_H +#define UTILS_H + +YOSYS_NAMESPACE_BEGIN + +// ------------------------------------------------ +// A map-like container, but you can save and restore the state +// ------------------------------------------------ + +template> +struct stackmap +{ +private: + std::vector> backup_state; + dict current_state; + static T empty_tuple; + +public: + stackmap() { } + stackmap(const dict &other) : current_state(other) { } + + template + void operator=(const Other &other) + { + for (auto &it : current_state) + if (!backup_state.empty() && backup_state.back().count(it.first) == 0) + backup_state.back()[it.first] = new T(it.second); + current_state.clear(); + + for (auto &it : other) + set(it.first, it.second); + } + + bool has(const Key &k) + { + return current_state.count(k) != 0; + } + + void set(const Key &k, const T &v) + { + if (!backup_state.empty() && backup_state.back().count(k) == 0) + backup_state.back()[k] = current_state.count(k) ? new T(current_state.at(k)) : nullptr; + current_state[k] = v; + } + + void unset(const Key &k) + { + if (!backup_state.empty() && backup_state.back().count(k) == 0) + backup_state.back()[k] = current_state.count(k) ? new T(current_state.at(k)) : nullptr; + current_state.erase(k); + } + + const T &get(const Key &k) + { + if (current_state.count(k) == 0) + return empty_tuple; + return current_state.at(k); + } + + void reset(const Key &k) + { + for (int i = GetSize(backup_state)-1; i >= 0; i--) + if (backup_state[i].count(k) != 0) { + if (backup_state[i].at(k) == nullptr) + current_state.erase(k); + else + current_state[k] = *backup_state[i].at(k); + return; + } + current_state.erase(k); + } + + const dict &stdmap() + { + return current_state; + } + + void save() + { + backup_state.resize(backup_state.size()+1); + } + + void restore() + { + log_assert(!backup_state.empty()); + for (auto &it : backup_state.back()) + if (it.second != nullptr) { + current_state[it.first] = *it.second; + delete it.second; + } else + current_state.erase(it.first); + backup_state.pop_back(); + } + + ~stackmap() + { + while (!backup_state.empty()) + restore(); + } +}; + + +// ------------------------------------------------ +// A simple class for topological sorting +// ------------------------------------------------ + +template> +struct TopoSort +{ + bool analyze_loops, found_loops; + std::map, C> database; + std::set> loops; + std::vector sorted; + + TopoSort() + { + analyze_loops = true; + found_loops = false; + } + + void node(T n) + { + if (database.count(n) == 0) + database[n] = std::set(); + } + + void edge(T left, T right) + { + node(left); + database[right].insert(left); + } + + void sort_worker(const T &n, std::set &marked_cells, std::set &active_cells, std::vector &active_stack) + { + if (active_cells.count(n)) { + found_loops = true; + if (analyze_loops) { + std::set loop; + for (int i = GetSize(active_stack)-1; i >= 0; i--) { + loop.insert(active_stack[i]); + if (active_stack[i] == n) + break; + } + loops.insert(loop); + } + return; + } + + if (marked_cells.count(n)) + return; + + if (!database.at(n).empty()) + { + if (analyze_loops) + active_stack.push_back(n); + active_cells.insert(n); + + for (auto &left_n : database.at(n)) + sort_worker(left_n, marked_cells, active_cells, active_stack); + + if (analyze_loops) + active_stack.pop_back(); + active_cells.erase(n); + } + + marked_cells.insert(n); + sorted.push_back(n); + } + + bool sort() + { + loops.clear(); + sorted.clear(); + found_loops = false; + + std::set marked_cells; + std::set active_cells; + std::vector active_stack; + + for (auto &it : database) + sort_worker(it.first, marked_cells, active_cells, active_stack); + + log_assert(GetSize(sorted) == GetSize(database)); + return !found_loops; + } +}; + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/kernel/yosys.h b/verilog/windows/autoyosys/share/include/kernel/yosys.h new file mode 100644 index 0000000..ae73146 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/kernel/yosys.h @@ -0,0 +1,311 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + + +// *** NOTE TO THE READER *** +// +// Maybe you have just opened this file in the hope to learn more about the +// Yosys API. Let me congratulate you on this great decision! ;) +// +// If you want to know how the design is represented by Yosys in the memory, +// you should read "kernel/rtlil.h". +// +// If you want to know how to register a command with Yosys, you could read +// "kernel/register.h", but it would be easier to just look at a simple +// example instead. A simple one would be "passes/cmds/log.cc". +// +// This header is very boring. It just defines some general things that +// belong nowhere else and includes the interesting headers. +// +// Find more information in the "CodingReadme" file. + + +#ifndef YOSYS_H +#define YOSYS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#ifndef _YOSYS_ +# error It looks like you are trying to build Yosys without the config defines set. \ + When building Yosys with a custom make system, make sure you set all the \ + defines the Yosys Makefile would set for your build configuration. +#endif + +#ifdef YOSYS_ENABLE_TCL +# include +#endif + +#ifdef _WIN32 +# undef NOMINMAX +# define NOMINMAX 1 +# undef YY_NO_UNISTD_H +# define YY_NO_UNISTD_H 1 + +# include +# include +# include + +# define strtok_r strtok_s +# define strdup _strdup +# define snprintf _snprintf +# define getcwd _getcwd +# define mkdir _mkdir +# define popen _popen +# define pclose _pclose + +# ifndef __MINGW32__ +# define PATH_MAX MAX_PATH +# define isatty _isatty +# define fileno _fileno +# endif +#endif + +#ifndef PATH_MAX +# define PATH_MAX 4096 +#endif + +#define PRIVATE_NAMESPACE_BEGIN namespace { +#define PRIVATE_NAMESPACE_END } +#define YOSYS_NAMESPACE_BEGIN namespace Yosys { +#define YOSYS_NAMESPACE_END } +#define YOSYS_NAMESPACE_PREFIX Yosys:: +#define USING_YOSYS_NAMESPACE using namespace Yosys; + +#if __cplusplus >= 201103L +# define YS_OVERRIDE override +# define YS_FINAL final +#else +# define YS_OVERRIDE +# define YS_FINAL +#endif + +#if defined(__GNUC__) || defined(__clang__) +# define YS_ATTRIBUTE(...) __attribute__((__VA_ARGS__)) +# define YS_NORETURN +#elif defined(_MSC_VER) +# define YS_ATTRIBUTE(...) +# define YS_NORETURN __declspec(noreturn) +#else +# define YS_ATTRIBUTE(...) +# define YS_NORETURN +#endif + +YOSYS_NAMESPACE_BEGIN + +// Note: All headers included in hashlib.h must be included +// outside of YOSYS_NAMESPACE before this or bad things will happen. +#ifdef HASHLIB_H +# undef HASHLIB_H +# include "kernel/hashlib.h" +#else +# include "kernel/hashlib.h" +# undef HASHLIB_H +#endif + +using std::vector; +using std::string; +using std::tuple; +using std::pair; + +using std::make_tuple; +using std::make_pair; +using std::min; +using std::max; + +// A primitive shared string implementation that does not +// move its .c_str() when the object is copied or moved. +struct shared_str { + std::shared_ptr content; + shared_str() { } + shared_str(string s) { content = std::shared_ptr(new string(s)); } + shared_str(const char *s) { content = std::shared_ptr(new string(s)); } + const char *c_str() const { return content->c_str(); } + const string &str() const { return *content; } + bool operator==(const shared_str &other) const { return *content == *other.content; } + unsigned int hash() const { return hashlib::hash_ops::hash(*content); } +}; + +using hashlib::mkhash; +using hashlib::mkhash_init; +using hashlib::mkhash_add; +using hashlib::mkhash_xorshift; +using hashlib::hash_ops; +using hashlib::hash_cstr_ops; +using hashlib::hash_ptr_ops; +using hashlib::hash_obj_ops; +using hashlib::dict; +using hashlib::idict; +using hashlib::pool; +using hashlib::mfp; + +namespace RTLIL { + struct IdString; + struct Const; + struct SigBit; + struct SigSpec; + struct Wire; + struct Cell; + struct Module; + struct Design; + struct Monitor; +} + +namespace AST { + struct AstNode; +} + +using RTLIL::IdString; +using RTLIL::Const; +using RTLIL::SigBit; +using RTLIL::SigSpec; +using RTLIL::Wire; +using RTLIL::Cell; +using RTLIL::Module; +using RTLIL::Design; + +namespace hashlib { + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; + + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; + template<> struct hash_ops : hash_obj_ops {}; +} + +void memhasher_on(); +void memhasher_off(); +void memhasher_do(); + +extern bool memhasher_active; +inline void memhasher() { if (memhasher_active) memhasher_do(); } + +void yosys_banner(); +int ceil_log2(int x); +std::string stringf(const char *fmt, ...) YS_ATTRIBUTE(format(printf, 1, 2)); +std::string vstringf(const char *fmt, va_list ap); +int readsome(std::istream &f, char *s, int n); +std::string next_token(std::string &text, const char *sep = " \t\r\n", bool long_strings = false); +std::vector split_tokens(const std::string &text, const char *sep = " \t\r\n"); +bool patmatch(const char *pattern, const char *string); +int run_command(const std::string &command, std::function process_line = std::function()); +std::string make_temp_file(std::string template_str = "/tmp/yosys_XXXXXX"); +std::string make_temp_dir(std::string template_str = "/tmp/yosys_XXXXXX"); +bool check_file_exists(std::string filename, bool is_exec = false); +bool is_absolute_path(std::string filename); +void remove_directory(std::string dirname); + +template int GetSize(const T &obj) { return obj.size(); } +int GetSize(RTLIL::Wire *wire); + +extern int autoidx; +extern int yosys_xtrace; + +YOSYS_NAMESPACE_END + +#include "kernel/log.h" +#include "kernel/rtlil.h" +#include "kernel/register.h" + +YOSYS_NAMESPACE_BEGIN + +using RTLIL::State; +using RTLIL::SigChunk; +using RTLIL::SigSig; + +namespace hashlib { + template<> struct hash_ops : hash_ops {}; +} + +void yosys_setup(); +void yosys_shutdown(); + +#ifdef YOSYS_ENABLE_TCL +Tcl_Interp *yosys_get_tcl_interp(); +#endif + +extern RTLIL::Design *yosys_design; + +RTLIL::IdString new_id(std::string file, int line, std::string func); + +#define NEW_ID \ + YOSYS_NAMESPACE_PREFIX new_id(__FILE__, __LINE__, __FUNCTION__) + +#define ID(_str) \ + ([]() { static YOSYS_NAMESPACE_PREFIX RTLIL::IdString _id(_str); return _id; })() + +RTLIL::Design *yosys_get_design(); +std::string proc_self_dirname(); +std::string proc_share_dirname(); +const char *create_prompt(RTLIL::Design *design, int recursion_counter); +std::vector glob_filename(const std::string &filename_pattern); +void rewrite_filename(std::string &filename); + +void run_pass(std::string command, RTLIL::Design *design = nullptr); +void run_frontend(std::string filename, std::string command, std::string *backend_command, std::string *from_to_label = nullptr, RTLIL::Design *design = nullptr); +void run_frontend(std::string filename, std::string command, RTLIL::Design *design = nullptr); +void run_backend(std::string filename, std::string command, RTLIL::Design *design = nullptr); +void shell(RTLIL::Design *design); + +// from kernel/version_*.o (cc source generated from Makefile) +extern const char *yosys_version_str; + +// from passes/cmds/design.cc +extern std::map saved_designs; +extern std::vector pushed_designs; + +// from passes/cmds/pluginc.cc +extern std::map loaded_plugins; +extern std::map loaded_plugin_aliases; +void load_plugin(std::string filename, std::vector aliases); + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/include/libs/ezsat/ezminisat.h b/verilog/windows/autoyosys/share/include/libs/ezsat/ezminisat.h new file mode 100644 index 0000000..983e6fd --- /dev/null +++ b/verilog/windows/autoyosys/share/include/libs/ezsat/ezminisat.h @@ -0,0 +1,71 @@ +/* + * ezSAT -- A simple and easy to use CNF generator for SAT solvers + * + * Copyright (C) 2013 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef EZMINISAT_H +#define EZMINISAT_H + +#define EZMINISAT_SIMPSOLVER 1 +#define EZMINISAT_VERBOSITY 0 +#define EZMINISAT_INCREMENTAL 1 + +#include "ezsat.h" +#include + +// minisat is using limit macros and format macros in their headers that +// can be the source of some troubles when used from c++11. thefore we +// don't force ezSAT users to use minisat headers.. +namespace Minisat { + class Solver; + class SimpSolver; +} + +class ezMiniSAT : public ezSAT +{ +private: +#if EZMINISAT_SIMPSOLVER + typedef Minisat::SimpSolver Solver; +#else + typedef Minisat::Solver Solver; +#endif + Solver *minisatSolver; + std::vector minisatVars; + bool foundContradiction; + +#if EZMINISAT_SIMPSOLVER && EZMINISAT_INCREMENTAL + std::set cnfFrozenVars; +#endif + +#ifndef _WIN32 + static ezMiniSAT *alarmHandlerThis; + static clock_t alarmHandlerTimeout; + static void alarmHandler(int); +#endif + +public: + ezMiniSAT(); + virtual ~ezMiniSAT(); + virtual void clear(); +#if EZMINISAT_SIMPSOLVER && EZMINISAT_INCREMENTAL + virtual void freeze(int id); + virtual bool eliminated(int idx); +#endif + virtual bool solver(const std::vector &modelExpressions, std::vector &modelValues, const std::vector &assumptions); +}; + +#endif diff --git a/verilog/windows/autoyosys/share/include/libs/ezsat/ezsat.h b/verilog/windows/autoyosys/share/include/libs/ezsat/ezsat.h new file mode 100644 index 0000000..85b1368 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/libs/ezsat/ezsat.h @@ -0,0 +1,359 @@ +/* + * ezSAT -- A simple and easy to use CNF generator for SAT solvers + * + * Copyright (C) 2013 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef EZSAT_H +#define EZSAT_H + +#include +#include +#include +#include +#include +#include + +class ezSAT +{ + // each token (terminal or non-terminal) is represented by an integer number + // + // the zero token: + // the number zero is not used as valid token number and is used to encode + // unused parameters for the functions. + // + // positive numbers are literals, with 1 = CONST_TRUE and 2 = CONST_FALSE; + // + // negative numbers are non-literal expressions. each expression is represented + // by an operator id and a list of expressions (literals or non-literals). + +public: + enum OpId { + OpNot, OpAnd, OpOr, OpXor, OpIFF, OpITE + }; + + static const int CONST_TRUE; + static const int CONST_FALSE; + +private: + bool flag_keep_cnf; + bool flag_non_incremental; + + bool non_incremental_solve_used_up; + + std::map literalsCache; + std::vector literals; + + std::map>, int> expressionsCache; + std::vector>> expressions; + + bool cnfConsumed; + int cnfVariableCount, cnfClausesCount; + std::vector cnfLiteralVariables, cnfExpressionVariables; + std::vector> cnfClauses, cnfClausesBackup; + + void add_clause(const std::vector &args); + void add_clause(const std::vector &args, bool argsPolarity, int a = 0, int b = 0, int c = 0); + void add_clause(int a, int b = 0, int c = 0); + + int bind_cnf_not(const std::vector &args); + int bind_cnf_and(const std::vector &args); + int bind_cnf_or(const std::vector &args); + +protected: + void preSolverCallback(); + +public: + int solverTimeout; + bool solverTimoutStatus; + + ezSAT(); + virtual ~ezSAT(); + + unsigned int statehash; + void addhash(unsigned int); + + void keep_cnf() { flag_keep_cnf = true; } + void non_incremental() { flag_non_incremental = true; } + + bool mode_keep_cnf() const { return flag_keep_cnf; } + bool mode_non_incremental() const { return flag_non_incremental; } + + // manage expressions + + int value(bool val); + int literal(); + int literal(const std::string &name); + int frozen_literal(); + int frozen_literal(const std::string &name); + int expression(OpId op, int a = 0, int b = 0, int c = 0, int d = 0, int e = 0, int f = 0); + int expression(OpId op, const std::vector &args); + + void lookup_literal(int id, std::string &name) const; + const std::string &lookup_literal(int id) const; + + void lookup_expression(int id, OpId &op, std::vector &args) const; + const std::vector &lookup_expression(int id, OpId &op) const; + + int parse_string(const std::string &text); + std::string to_string(int id) const; + + int numLiterals() const { return literals.size(); } + int numExpressions() const { return expressions.size(); } + + int eval(int id, const std::vector &values) const; + + // SAT solver interface + // If you are planning on using the solver API (and not simply create a CNF) you must use a child class + // of ezSAT that actually implements a solver backend, such as ezMiniSAT (see ezminisat.h). + + virtual bool solver(const std::vector &modelExpressions, std::vector &modelValues, const std::vector &assumptions); + + bool solve(const std::vector &modelExpressions, std::vector &modelValues, const std::vector &assumptions) { + return solver(modelExpressions, modelValues, assumptions); + } + + bool solve(const std::vector &modelExpressions, std::vector &modelValues, int a = 0, int b = 0, int c = 0, int d = 0, int e = 0, int f = 0) { + std::vector assumptions; + if (a != 0) assumptions.push_back(a); + if (b != 0) assumptions.push_back(b); + if (c != 0) assumptions.push_back(c); + if (d != 0) assumptions.push_back(d); + if (e != 0) assumptions.push_back(e); + if (f != 0) assumptions.push_back(f); + return solver(modelExpressions, modelValues, assumptions); + } + + bool solve(int a = 0, int b = 0, int c = 0, int d = 0, int e = 0, int f = 0) { + std::vector assumptions, modelExpressions; + std::vector modelValues; + if (a != 0) assumptions.push_back(a); + if (b != 0) assumptions.push_back(b); + if (c != 0) assumptions.push_back(c); + if (d != 0) assumptions.push_back(d); + if (e != 0) assumptions.push_back(e); + if (f != 0) assumptions.push_back(f); + return solver(modelExpressions, modelValues, assumptions); + } + + void setSolverTimeout(int newTimeoutSeconds) { + solverTimeout = newTimeoutSeconds; + } + + bool getSolverTimoutStatus() { + return solverTimoutStatus; + } + + // manage CNF (usually only accessed by SAT solvers) + + virtual void clear(); + virtual void freeze(int id); + virtual bool eliminated(int idx); + void assume(int id); + void assume(int id, int context_id) { assume(OR(id, NOT(context_id))); } + int bind(int id, bool auto_freeze = true); + int bound(int id) const; + + int numCnfVariables() const { return cnfVariableCount; } + int numCnfClauses() const { return cnfClausesCount; } + const std::vector> &cnf() const { return cnfClauses; } + + void consumeCnf(); + void consumeCnf(std::vector> &cnf); + + // use this function to get the full CNF in keep_cnf mode + void getFullCnf(std::vector> &full_cnf) const; + + std::string cnfLiteralInfo(int idx) const; + + // simple helpers for build expressions easily + + struct _V { + int id; + std::string name; + _V(int id) : id(id) { } + _V(const char *name) : id(0), name(name) { } + _V(const std::string &name) : id(0), name(name) { } + int get(ezSAT *that) { + if (name.empty()) + return id; + return that->frozen_literal(name); + } + }; + + int VAR(_V a) { + return a.get(this); + } + + int NOT(_V a) { + return expression(OpNot, a.get(this)); + } + + int AND(_V a = 0, _V b = 0, _V c = 0, _V d = 0, _V e = 0, _V f = 0) { + return expression(OpAnd, a.get(this), b.get(this), c.get(this), d.get(this), e.get(this), f.get(this)); + } + + int OR(_V a = 0, _V b = 0, _V c = 0, _V d = 0, _V e = 0, _V f = 0) { + return expression(OpOr, a.get(this), b.get(this), c.get(this), d.get(this), e.get(this), f.get(this)); + } + + int XOR(_V a = 0, _V b = 0, _V c = 0, _V d = 0, _V e = 0, _V f = 0) { + return expression(OpXor, a.get(this), b.get(this), c.get(this), d.get(this), e.get(this), f.get(this)); + } + + int IFF(_V a, _V b = 0, _V c = 0, _V d = 0, _V e = 0, _V f = 0) { + return expression(OpIFF, a.get(this), b.get(this), c.get(this), d.get(this), e.get(this), f.get(this)); + } + + int ITE(_V a, _V b, _V c) { + return expression(OpITE, a.get(this), b.get(this), c.get(this)); + } + + void SET(_V a, _V b) { + assume(IFF(a.get(this), b.get(this))); + } + + // simple helpers for building expressions with bit vectors + + std::vector vec_const(const std::vector &bits); + std::vector vec_const_signed(int64_t value, int numBits); + std::vector vec_const_unsigned(uint64_t value, int numBits); + std::vector vec_var(int numBits); + std::vector vec_var(std::string name, int numBits); + std::vector vec_cast(const std::vector &vec1, int toBits, bool signExtend = false); + + std::vector vec_not(const std::vector &vec1); + std::vector vec_and(const std::vector &vec1, const std::vector &vec2); + std::vector vec_or(const std::vector &vec1, const std::vector &vec2); + std::vector vec_xor(const std::vector &vec1, const std::vector &vec2); + + std::vector vec_iff(const std::vector &vec1, const std::vector &vec2); + std::vector vec_ite(const std::vector &vec1, const std::vector &vec2, const std::vector &vec3); + std::vector vec_ite(int sel, const std::vector &vec1, const std::vector &vec2); + + std::vector vec_count(const std::vector &vec, int numBits, bool clip = true); + std::vector vec_add(const std::vector &vec1, const std::vector &vec2); + std::vector vec_sub(const std::vector &vec1, const std::vector &vec2); + std::vector vec_neg(const std::vector &vec); + + void vec_cmp(const std::vector &vec1, const std::vector &vec2, int &carry, int &overflow, int &sign, int &zero); + + int vec_lt_signed(const std::vector &vec1, const std::vector &vec2); + int vec_le_signed(const std::vector &vec1, const std::vector &vec2); + int vec_ge_signed(const std::vector &vec1, const std::vector &vec2); + int vec_gt_signed(const std::vector &vec1, const std::vector &vec2); + + int vec_lt_unsigned(const std::vector &vec1, const std::vector &vec2); + int vec_le_unsigned(const std::vector &vec1, const std::vector &vec2); + int vec_ge_unsigned(const std::vector &vec1, const std::vector &vec2); + int vec_gt_unsigned(const std::vector &vec1, const std::vector &vec2); + + int vec_eq(const std::vector &vec1, const std::vector &vec2); + int vec_ne(const std::vector &vec1, const std::vector &vec2); + + std::vector vec_shl(const std::vector &vec1, int shift, bool signExtend = false); + std::vector vec_srl(const std::vector &vec1, int shift); + + std::vector vec_shr(const std::vector &vec1, int shift, bool signExtend = false) { return vec_shl(vec1, -shift, signExtend); } + std::vector vec_srr(const std::vector &vec1, int shift) { return vec_srl(vec1, -shift); } + + std::vector vec_shift(const std::vector &vec1, int shift, int extend_left, int extend_right); + std::vector vec_shift_right(const std::vector &vec1, const std::vector &vec2, bool vec2_signed, int extend_left, int extend_right); + std::vector vec_shift_left(const std::vector &vec1, const std::vector &vec2, bool vec2_signed, int extend_left, int extend_right); + + void vec_append(std::vector &vec, const std::vector &vec1) const; + void vec_append_signed(std::vector &vec, const std::vector &vec1, int64_t value); + void vec_append_unsigned(std::vector &vec, const std::vector &vec1, uint64_t value); + + int64_t vec_model_get_signed(const std::vector &modelExpressions, const std::vector &modelValues, const std::vector &vec1) const; + uint64_t vec_model_get_unsigned(const std::vector &modelExpressions, const std::vector &modelValues, const std::vector &vec1) const; + + int vec_reduce_and(const std::vector &vec1); + int vec_reduce_or(const std::vector &vec1); + + void vec_set(const std::vector &vec1, const std::vector &vec2); + void vec_set_signed(const std::vector &vec1, int64_t value); + void vec_set_unsigned(const std::vector &vec1, uint64_t value); + + // helpers for generating ezSATbit and ezSATvec objects + + struct ezSATbit bit(_V a); + struct ezSATvec vec(const std::vector &vec); + + // printing CNF and internal state + + void printDIMACS(FILE *f, bool verbose = false) const; + void printInternalState(FILE *f) const; + + // more sophisticated constraints (designed to be used directly with assume(..)) + + int onehot(const std::vector &vec, bool max_only = false); + int manyhot(const std::vector &vec, int min_hot, int max_hot = -1); + int ordered(const std::vector &vec1, const std::vector &vec2, bool allow_equal = true); +}; + +// helper classes for using operator overloading when generating complex expressions + +struct ezSATbit +{ + ezSAT &sat; + int id; + + ezSATbit(ezSAT &sat, ezSAT::_V a) : sat(sat), id(sat.VAR(a)) { } + + ezSATbit operator ~() { return ezSATbit(sat, sat.NOT(id)); } + ezSATbit operator &(const ezSATbit &other) { return ezSATbit(sat, sat.AND(id, other.id)); } + ezSATbit operator |(const ezSATbit &other) { return ezSATbit(sat, sat.OR(id, other.id)); } + ezSATbit operator ^(const ezSATbit &other) { return ezSATbit(sat, sat.XOR(id, other.id)); } + ezSATbit operator ==(const ezSATbit &other) { return ezSATbit(sat, sat.IFF(id, other.id)); } + ezSATbit operator !=(const ezSATbit &other) { return ezSATbit(sat, sat.NOT(sat.IFF(id, other.id))); } + + operator int() const { return id; } + operator ezSAT::_V() const { return ezSAT::_V(id); } + operator std::vector() const { return std::vector(1, id); } +}; + +struct ezSATvec +{ + ezSAT &sat; + std::vector vec; + + ezSATvec(ezSAT &sat, const std::vector &vec) : sat(sat), vec(vec) { } + + ezSATvec operator ~() { return ezSATvec(sat, sat.vec_not(vec)); } + ezSATvec operator -() { return ezSATvec(sat, sat.vec_neg(vec)); } + + ezSATvec operator &(const ezSATvec &other) { return ezSATvec(sat, sat.vec_and(vec, other.vec)); } + ezSATvec operator |(const ezSATvec &other) { return ezSATvec(sat, sat.vec_or(vec, other.vec)); } + ezSATvec operator ^(const ezSATvec &other) { return ezSATvec(sat, sat.vec_xor(vec, other.vec)); } + + ezSATvec operator +(const ezSATvec &other) { return ezSATvec(sat, sat.vec_add(vec, other.vec)); } + ezSATvec operator -(const ezSATvec &other) { return ezSATvec(sat, sat.vec_sub(vec, other.vec)); } + + ezSATbit operator < (const ezSATvec &other) { return ezSATbit(sat, sat.vec_lt_unsigned(vec, other.vec)); } + ezSATbit operator <=(const ezSATvec &other) { return ezSATbit(sat, sat.vec_le_unsigned(vec, other.vec)); } + ezSATbit operator ==(const ezSATvec &other) { return ezSATbit(sat, sat.vec_eq(vec, other.vec)); } + ezSATbit operator !=(const ezSATvec &other) { return ezSATbit(sat, sat.vec_ne(vec, other.vec)); } + ezSATbit operator >=(const ezSATvec &other) { return ezSATbit(sat, sat.vec_ge_unsigned(vec, other.vec)); } + ezSATbit operator > (const ezSATvec &other) { return ezSATbit(sat, sat.vec_gt_unsigned(vec, other.vec)); } + + ezSATvec operator <<(int shift) { return ezSATvec(sat, sat.vec_shl(vec, shift)); } + ezSATvec operator >>(int shift) { return ezSATvec(sat, sat.vec_shr(vec, shift)); } + + operator std::vector() const { return vec; } +}; + +#endif diff --git a/verilog/windows/autoyosys/share/include/libs/sha1/sha1.h b/verilog/windows/autoyosys/share/include/libs/sha1/sha1.h new file mode 100644 index 0000000..9f52637 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/libs/sha1/sha1.h @@ -0,0 +1,57 @@ +/* + sha1.h - header of + + ============ + SHA-1 in C++ + ============ + + 100% Public Domain. + + Original C Code + -- Steve Reid + Small changes to fit into bglibs + -- Bruce Guenter + Translation to simpler C++ Code + -- Volker Grabsch + Fixing bugs and improving style + -- Eugene Hopkinson +*/ + +#ifndef SHA1_HPP +#define SHA1_HPP + + +#include +#include +#include + +class SHA1 +{ +public: + SHA1(); + void update(const std::string &s); + void update(std::istream &is); + std::string final(); + static std::string from_file(const std::string &filename); + +private: + static const unsigned int DIGEST_INTS = 5; /* number of 32bit integers per SHA1 digest */ + static const unsigned int BLOCK_INTS = 16; /* number of 32bit integers per SHA1 block */ + static const unsigned int BLOCK_BYTES = BLOCK_INTS * 4; + + uint32_t digest[DIGEST_INTS]; + std::string buffer; + uint64_t transforms; + + void reset(); + void transform(uint32_t block[BLOCK_BYTES]); + + static void read(std::istream &is, std::string &s, size_t max); + static void buffer_to_block(const std::string &buffer, uint32_t block[BLOCK_INTS]); +}; + +std::string sha1(const std::string &string); + + + +#endif /* SHA1_HPP */ diff --git a/verilog/windows/autoyosys/share/include/passes/fsm/fsmdata.h b/verilog/windows/autoyosys/share/include/passes/fsm/fsmdata.h new file mode 100644 index 0000000..6822276 --- /dev/null +++ b/verilog/windows/autoyosys/share/include/passes/fsm/fsmdata.h @@ -0,0 +1,178 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef FSMDATA_H +#define FSMDATA_H + +#include "kernel/yosys.h" + +YOSYS_NAMESPACE_BEGIN + +struct FsmData +{ + int num_inputs, num_outputs, state_bits, reset_state; + struct transition_t { int state_in, state_out; RTLIL::Const ctrl_in, ctrl_out; }; + std::vector transition_table; + std::vector state_table; + + void copy_to_cell(RTLIL::Cell *cell) + { + cell->parameters["\\CTRL_IN_WIDTH"] = RTLIL::Const(num_inputs); + cell->parameters["\\CTRL_OUT_WIDTH"] = RTLIL::Const(num_outputs); + + int state_num_log2 = 0; + for (int i = state_table.size(); i > 0; i = i >> 1) + state_num_log2++; + state_num_log2 = max(state_num_log2, 1); + + cell->parameters["\\STATE_BITS"] = RTLIL::Const(state_bits); + cell->parameters["\\STATE_NUM"] = RTLIL::Const(state_table.size()); + cell->parameters["\\STATE_NUM_LOG2"] = RTLIL::Const(state_num_log2); + cell->parameters["\\STATE_RST"] = RTLIL::Const(reset_state); + cell->parameters["\\STATE_TABLE"] = RTLIL::Const(); + + for (int i = 0; i < int(state_table.size()); i++) { + std::vector &bits_table = cell->parameters["\\STATE_TABLE"].bits; + std::vector &bits_state = state_table[i].bits; + bits_table.insert(bits_table.end(), bits_state.begin(), bits_state.end()); + } + + cell->parameters["\\TRANS_NUM"] = RTLIL::Const(transition_table.size()); + cell->parameters["\\TRANS_TABLE"] = RTLIL::Const(); + for (int i = 0; i < int(transition_table.size()); i++) + { + std::vector &bits_table = cell->parameters["\\TRANS_TABLE"].bits; + transition_t &tr = transition_table[i]; + + RTLIL::Const const_state_in = RTLIL::Const(tr.state_in, state_num_log2); + RTLIL::Const const_state_out = RTLIL::Const(tr.state_out, state_num_log2); + std::vector &bits_state_in = const_state_in.bits; + std::vector &bits_state_out = const_state_out.bits; + + std::vector &bits_ctrl_in = tr.ctrl_in.bits; + std::vector &bits_ctrl_out = tr.ctrl_out.bits; + + // append lsb first + bits_table.insert(bits_table.end(), bits_ctrl_out.begin(), bits_ctrl_out.end()); + bits_table.insert(bits_table.end(), bits_state_out.begin(), bits_state_out.end()); + bits_table.insert(bits_table.end(), bits_ctrl_in.begin(), bits_ctrl_in.end()); + bits_table.insert(bits_table.end(), bits_state_in.begin(), bits_state_in.end()); + } + } + + void copy_from_cell(RTLIL::Cell *cell) + { + num_inputs = cell->parameters["\\CTRL_IN_WIDTH"].as_int(); + num_outputs = cell->parameters["\\CTRL_OUT_WIDTH"].as_int(); + + state_bits = cell->parameters["\\STATE_BITS"].as_int(); + reset_state = cell->parameters["\\STATE_RST"].as_int(); + + int state_num = cell->parameters["\\STATE_NUM"].as_int(); + int state_num_log2 = cell->parameters["\\STATE_NUM_LOG2"].as_int(); + int trans_num = cell->parameters["\\TRANS_NUM"].as_int(); + + if (reset_state < 0 || reset_state >= state_num) + reset_state = -1; + + RTLIL::Const state_table = cell->parameters["\\STATE_TABLE"]; + RTLIL::Const trans_table = cell->parameters["\\TRANS_TABLE"]; + + for (int i = 0; i < state_num; i++) { + RTLIL::Const state_code; + int off_begin = i*state_bits, off_end = off_begin + state_bits; + state_code.bits.insert(state_code.bits.begin(), state_table.bits.begin()+off_begin, state_table.bits.begin()+off_end); + this->state_table.push_back(state_code); + } + + for (int i = 0; i < trans_num; i++) + { + auto off_ctrl_out = trans_table.bits.begin() + i*(num_inputs+num_outputs+2*state_num_log2); + auto off_state_out = off_ctrl_out + num_outputs; + auto off_ctrl_in = off_state_out + state_num_log2; + auto off_state_in = off_ctrl_in + num_inputs; + auto off_end = off_state_in + state_num_log2; + + RTLIL::Const state_in, state_out, ctrl_in, ctrl_out; + ctrl_out.bits.insert(state_in.bits.begin(), off_ctrl_out, off_state_out); + state_out.bits.insert(state_out.bits.begin(), off_state_out, off_ctrl_in); + ctrl_in.bits.insert(ctrl_in.bits.begin(), off_ctrl_in, off_state_in); + state_in.bits.insert(state_in.bits.begin(), off_state_in, off_end); + + transition_t tr; + tr.state_in = state_in.as_int(); + tr.state_out = state_out.as_int(); + tr.ctrl_in = ctrl_in; + tr.ctrl_out = ctrl_out; + + if (tr.state_in < 0 || tr.state_in >= state_num) + tr.state_in = -1; + if (tr.state_out < 0 || tr.state_out >= state_num) + tr.state_out = -1; + + transition_table.push_back(tr); + } + } + + void log_info(RTLIL::Cell *cell) + { + log("-------------------------------------\n"); + log("\n"); + log(" Information on FSM %s (%s):\n", cell->name.c_str(), cell->parameters["\\NAME"].decode_string().c_str()); + log("\n"); + log(" Number of input signals: %3d\n", num_inputs); + log(" Number of output signals: %3d\n", num_outputs); + log(" Number of state bits: %3d\n", state_bits); + + log("\n"); + log(" Input signals:\n"); + RTLIL::SigSpec sig_in = cell->getPort("\\CTRL_IN"); + for (int i = 0; i < GetSize(sig_in); i++) + log(" %3d: %s\n", i, log_signal(sig_in[i])); + + log("\n"); + log(" Output signals:\n"); + RTLIL::SigSpec sig_out = cell->getPort("\\CTRL_OUT"); + for (int i = 0; i < GetSize(sig_out); i++) + log(" %3d: %s\n", i, log_signal(sig_out[i])); + + log("\n"); + log(" State encoding:\n"); + for (int i = 0; i < GetSize(state_table); i++) + log(" %3d: %10s%s\n", i, log_signal(state_table[i], false), + int(i) == reset_state ? " " : ""); + + log("\n"); + log(" Transition Table (state_in, ctrl_in, state_out, ctrl_out):\n"); + for (int i = 0; i < GetSize(transition_table); i++) { + transition_t &tr = transition_table[i]; + log(" %5d: %5d %s -> %5d %s\n", i, tr.state_in, log_signal(tr.ctrl_in), tr.state_out, log_signal(tr.ctrl_out)); + } + + log("\n"); + log("-------------------------------------\n"); + } + + // implemented in fsm_opt.cc + static void optimize_fsm(RTLIL::Cell *cell, RTLIL::Module *module); +}; + +YOSYS_NAMESPACE_END + +#endif diff --git a/verilog/windows/autoyosys/share/pmux2mux.v b/verilog/windows/autoyosys/share/pmux2mux.v new file mode 100644 index 0000000..9c97245 --- /dev/null +++ b/verilog/windows/autoyosys/share/pmux2mux.v @@ -0,0 +1,21 @@ +module \$pmux (A, B, S, Y); + +wire [1023:0] _TECHMAP_DO_ = "proc; clean"; + +parameter WIDTH = 1; +parameter S_WIDTH = 1; + +input [WIDTH-1:0] A; +input [WIDTH*S_WIDTH-1:0] B; +input [S_WIDTH-1:0] S; +output reg [WIDTH-1:0] Y; + +integer i; + +always @* begin + Y <= A; + for (i = 0; i < S_WIDTH; i=i+1) + if (S[i]) Y <= B[WIDTH*i +: WIDTH]; +end + +endmodule diff --git a/verilog/windows/autoyosys/share/simcells.v b/verilog/windows/autoyosys/share/simcells.v new file mode 100644 index 0000000..e770c54 --- /dev/null +++ b/verilog/windows/autoyosys/share/simcells.v @@ -0,0 +1,1276 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The internal logic cell simulation library. + * + * This Verilog library contains simple simulation models for the internal + * logic cells ($_NOT_ , $_AND_ , ...) that are generated by the default technology + * mapper (see "techmap.v" in this directory) and expected by the "abc" pass. + * + */ + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_BUF_ (A, Y) +//- +//- A buffer. This cell type is always optimized away by the opt_clean pass. +//- +//- Truth table: A | Y +//- ---+--- +//- 0 | 0 +//- 1 | 1 +//- +module \$_BUF_ (A, Y); +input A; +output Y; +assign Y = A; +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_NOT_ (A, Y) +//- +//- An inverter gate. +//- +//- Truth table: A | Y +//- ---+--- +//- 0 | 1 +//- 1 | 0 +//- +module \$_NOT_ (A, Y); +input A; +output Y; +assign Y = ~A; +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_AND_ (A, B, Y) +//- +//- A 2-input AND gate. +//- +//- Truth table: A B | Y +//- -----+--- +//- 0 0 | 0 +//- 0 1 | 0 +//- 1 0 | 0 +//- 1 1 | 1 +//- +module \$_AND_ (A, B, Y); +input A, B; +output Y; +assign Y = A & B; +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_NAND_ (A, B, Y) +//- +//- A 2-input NAND gate. +//- +//- Truth table: A B | Y +//- -----+--- +//- 0 0 | 1 +//- 0 1 | 1 +//- 1 0 | 1 +//- 1 1 | 0 +//- +module \$_NAND_ (A, B, Y); +input A, B; +output Y; +assign Y = ~(A & B); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_OR_ (A, B, Y) +//- +//- A 2-input OR gate. +//- +//- Truth table: A B | Y +//- -----+--- +//- 0 0 | 0 +//- 0 1 | 1 +//- 1 0 | 1 +//- 1 1 | 1 +//- +module \$_OR_ (A, B, Y); +input A, B; +output Y; +assign Y = A | B; +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_NOR_ (A, B, Y) +//- +//- A 2-input NOR gate. +//- +//- Truth table: A B | Y +//- -----+--- +//- 0 0 | 1 +//- 0 1 | 0 +//- 1 0 | 0 +//- 1 1 | 0 +//- +module \$_NOR_ (A, B, Y); +input A, B; +output Y; +assign Y = ~(A | B); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_XOR_ (A, B, Y) +//- +//- A 2-input XOR gate. +//- +//- Truth table: A B | Y +//- -----+--- +//- 0 0 | 0 +//- 0 1 | 1 +//- 1 0 | 1 +//- 1 1 | 0 +//- +module \$_XOR_ (A, B, Y); +input A, B; +output Y; +assign Y = A ^ B; +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_XNOR_ (A, B, Y) +//- +//- A 2-input XNOR gate. +//- +//- Truth table: A B | Y +//- -----+--- +//- 0 0 | 1 +//- 0 1 | 0 +//- 1 0 | 0 +//- 1 1 | 1 +//- +module \$_XNOR_ (A, B, Y); +input A, B; +output Y; +assign Y = ~(A ^ B); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_MUX_ (A, B, S, Y) +//- +//- A 2-input MUX gate. +//- +//- Truth table: A B S | Y +//- -------+--- +//- a - 0 | a +//- - b 1 | b +//- +module \$_MUX_ (A, B, S, Y); +input A, B, S; +output Y; +assign Y = S ? B : A; +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_MUX4_ (A, B, C, D, S, T, Y) +//- +//- A 4-input MUX gate. +//- +//- Truth table: A B C D S T | Y +//- -------------+--- +//- a - - - 0 0 | a +//- - b - - 1 0 | b +//- - - c - 0 1 | c +//- - - - d 1 1 | d +//- +module \$_MUX4_ (A, B, C, D, S, T, Y); +input A, B, C, D, S, T; +output Y; +assign Y = T ? (S ? D : C) : + (S ? B : A); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_MUX8_ (A, B, C, D, E, F, G, H, S, T, U, Y) +//- +//- An 8-input MUX gate. +//- +//- Truth table: A B C D E F G H S T U | Y +//- -----------------------+--- +//- a - - - - - - - 0 0 0 | a +//- - b - - - - - - 1 0 0 | b +//- - - c - - - - - 0 1 0 | c +//- - - - d - - - - 1 1 0 | d +//- - - - - e - - - 0 0 1 | e +//- - - - - - f - - 1 0 1 | f +//- - - - - - - g - 0 1 1 | g +//- - - - - - - - h 1 1 1 | h +//- +module \$_MUX8_ (A, B, C, D, E, F, G, H, S, T, U, Y); +input A, B, C, D, E, F, G, H, S, T, U; +output Y; +assign Y = U ? T ? (S ? H : G) : + (S ? F : E) : + T ? (S ? D : C) : + (S ? B : A); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_MUX16_ (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, S, T, U, V, Y) +//- +//- A 16-input MUX gate. +//- +//- Truth table: A B C D E F G H I J K L M N O P S T U V | Y +//- -----------------------------------------+--- +//- a - - - - - - - - - - - - - - - 0 0 0 0 | a +//- - b - - - - - - - - - - - - - - 1 0 0 0 | b +//- - - c - - - - - - - - - - - - - 0 1 0 0 | c +//- - - - d - - - - - - - - - - - - 1 1 0 0 | d +//- - - - - e - - - - - - - - - - - 0 0 1 0 | e +//- - - - - - f - - - - - - - - - - 1 0 1 0 | f +//- - - - - - - g - - - - - - - - - 0 1 1 0 | g +//- - - - - - - - h - - - - - - - - 1 1 1 0 | h +//- - - - - - - - - i - - - - - - - 0 0 0 1 | i +//- - - - - - - - - - j - - - - - - 1 0 0 1 | j +//- - - - - - - - - - - k - - - - - 0 1 0 1 | k +//- - - - - - - - - - - - l - - - - 1 1 0 1 | l +//- - - - - - - - - - - - - m - - - 0 0 1 1 | m +//- - - - - - - - - - - - - - n - - 1 0 1 1 | n +//- - - - - - - - - - - - - - - o - 0 1 1 1 | o +//- - - - - - - - - - - - - - - - p 1 1 1 1 | p +//- +module \$_MUX16_ (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, S, T, U, V, Y); +input A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, S, T, U, V; +output Y; +assign Y = V ? U ? T ? (S ? P : O) : + (S ? N : M) : + T ? (S ? L : K) : + (S ? J : I) : + U ? T ? (S ? H : G) : + (S ? F : E) : + T ? (S ? D : C) : + (S ? B : A); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_AOI3_ (A, B, C, Y) +//- +//- A 3-input And-Or-Invert gate. +//- +//- Truth table: A B C | Y +//- -------+--- +//- 0 0 0 | 1 +//- 0 0 1 | 0 +//- 0 1 0 | 1 +//- 0 1 1 | 0 +//- 1 0 0 | 1 +//- 1 0 1 | 0 +//- 1 1 0 | 0 +//- 1 1 1 | 0 +//- +module \$_AOI3_ (A, B, C, Y); +input A, B, C; +output Y; +assign Y = ~((A & B) | C); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_OAI3_ (A, B, C, Y) +//- +//- A 3-input Or-And-Invert gate. +//- +//- Truth table: A B C | Y +//- -------+--- +//- 0 0 0 | 1 +//- 0 0 1 | 1 +//- 0 1 0 | 1 +//- 0 1 1 | 0 +//- 1 0 0 | 1 +//- 1 0 1 | 0 +//- 1 1 0 | 1 +//- 1 1 1 | 0 +//- +module \$_OAI3_ (A, B, C, Y); +input A, B, C; +output Y; +assign Y = ~((A | B) & C); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_AOI4_ (A, B, C, Y) +//- +//- A 4-input And-Or-Invert gate. +//- +//- Truth table: A B C D | Y +//- ---------+--- +//- 0 0 0 0 | 1 +//- 0 0 0 1 | 1 +//- 0 0 1 0 | 1 +//- 0 0 1 1 | 0 +//- 0 1 0 0 | 1 +//- 0 1 0 1 | 1 +//- 0 1 1 0 | 1 +//- 0 1 1 1 | 0 +//- 1 0 0 0 | 1 +//- 1 0 0 1 | 1 +//- 1 0 1 0 | 1 +//- 1 0 1 1 | 0 +//- 1 1 0 0 | 0 +//- 1 1 0 1 | 0 +//- 1 1 1 0 | 0 +//- 1 1 1 1 | 0 +//- +module \$_AOI4_ (A, B, C, D, Y); +input A, B, C, D; +output Y; +assign Y = ~((A & B) | (C & D)); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_OAI4_ (A, B, C, Y) +//- +//- A 4-input Or-And-Invert gate. +//- +//- Truth table: A B C D | Y +//- ---------+--- +//- 0 0 0 0 | 1 +//- 0 0 0 1 | 1 +//- 0 0 1 0 | 1 +//- 0 0 1 1 | 1 +//- 0 1 0 0 | 1 +//- 0 1 0 1 | 0 +//- 0 1 1 0 | 0 +//- 0 1 1 1 | 0 +//- 1 0 0 0 | 1 +//- 1 0 0 1 | 0 +//- 1 0 1 0 | 0 +//- 1 0 1 1 | 0 +//- 1 1 0 0 | 1 +//- 1 1 0 1 | 0 +//- 1 1 1 0 | 0 +//- 1 1 1 1 | 0 +//- +module \$_OAI4_ (A, B, C, D, Y); +input A, B, C, D; +output Y; +assign Y = ~((A | B) & (C | D)); +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_TBUF_ (A, E, Y) +//- +//- A tri-state buffer. +//- +//- Truth table: A E | Y +//- -----+--- +//- a 1 | a +//- - 0 | z +//- +module \$_TBUF_ (A, E, Y); +input A, E; +output Y; +assign Y = E ? A : 1'bz; +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_SR_NN_ (S, R, Q) +//- +//- A set-reset latch with negative polarity SET and RESET. +//- +//- Truth table: S R | Q +//- -----+--- +//- 0 0 | x +//- 0 1 | 1 +//- 1 0 | 0 +//- 1 1 | y +//- +module \$_SR_NN_ (S, R, Q); +input S, R; +output reg Q; +always @(negedge S, negedge R) begin + if (R == 0) + Q <= 0; + else if (S == 0) + Q <= 1; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_SR_NP_ (S, R, Q) +//- +//- A set-reset latch with negative polarity SET and positive polarioty RESET. +//- +//- Truth table: S R | Q +//- -----+--- +//- 0 1 | x +//- 0 0 | 1 +//- 1 1 | 0 +//- 1 0 | y +//- +module \$_SR_NP_ (S, R, Q); +input S, R; +output reg Q; +always @(negedge S, posedge R) begin + if (R == 1) + Q <= 0; + else if (S == 0) + Q <= 1; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_SR_PN_ (S, R, Q) +//- +//- A set-reset latch with positive polarity SET and negative polarioty RESET. +//- +//- Truth table: S R | Q +//- -----+--- +//- 1 0 | x +//- 1 1 | 1 +//- 0 0 | 0 +//- 0 1 | y +//- +module \$_SR_PN_ (S, R, Q); +input S, R; +output reg Q; +always @(posedge S, negedge R) begin + if (R == 0) + Q <= 0; + else if (S == 1) + Q <= 1; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_SR_PP_ (S, R, Q) +//- +//- A set-reset latch with positive polarity SET and RESET. +//- +//- Truth table: S R | Q +//- -----+--- +//- 1 1 | x +//- 1 0 | 1 +//- 0 1 | 0 +//- 0 0 | y +//- +module \$_SR_PP_ (S, R, Q); +input S, R; +output reg Q; +always @(posedge S, posedge R) begin + if (R == 1) + Q <= 0; + else if (S == 1) + Q <= 1; +end +endmodule + +`ifdef SIMCELLS_FF +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_FF_ (D, Q) +//- +//- A D-type flip-flop that is clocked from the implicit global clock. (This cell +//- type is usually only used in netlists for formal verification.) +//- +module \$_FF_ (D, Q); +input D; +output reg Q; +always @($global_clock) begin + Q <= D; +end +endmodule +`endif + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_N_ (D, C, Q) +//- +//- A negative edge D-type flip-flop. +//- +//- Truth table: D C | Q +//- -----+--- +//- d \ | d +//- - - | q +//- +module \$_DFF_N_ (D, C, Q); +input D, C; +output reg Q; +always @(negedge C) begin + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_P_ (D, C, Q) +//- +//- A positive edge D-type flip-flop. +//- +//- Truth table: D C | Q +//- -----+--- +//- d / | d +//- - - | q +//- +module \$_DFF_P_ (D, C, Q); +input D, C; +output reg Q; +always @(posedge C) begin + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFE_NN_ (D, C, E, Q) +//- +//- A negative edge D-type flip-flop with negative polarity enable. +//- +//- Truth table: D C E | Q +//- -------+--- +//- d \ 0 | d +//- - - - | q +//- +module \$_DFFE_NN_ (D, C, E, Q); +input D, C, E; +output reg Q; +always @(negedge C) begin + if (!E) Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFE_NP_ (D, C, E, Q) +//- +//- A negative edge D-type flip-flop with positive polarity enable. +//- +//- Truth table: D C E | Q +//- -------+--- +//- d \ 1 | d +//- - - - | q +//- +module \$_DFFE_NP_ (D, C, E, Q); +input D, C, E; +output reg Q; +always @(negedge C) begin + if (E) Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFE_PN_ (D, C, E, Q) +//- +//- A positive edge D-type flip-flop with negative polarity enable. +//- +//- Truth table: D C E | Q +//- -------+--- +//- d / 0 | d +//- - - - | q +//- +module \$_DFFE_PN_ (D, C, E, Q); +input D, C, E; +output reg Q; +always @(posedge C) begin + if (!E) Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFE_PP_ (D, C, E, Q) +//- +//- A positive edge D-type flip-flop with positive polarity enable. +//- +//- Truth table: D C E | Q +//- -------+--- +//- d / 1 | d +//- - - - | q +//- +module \$_DFFE_PP_ (D, C, E, Q); +input D, C, E; +output reg Q; +always @(posedge C) begin + if (E) Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_NN0_ (D, C, R, Q) +//- +//- A negative edge D-type flip-flop with negative polarity reset. +//- +//- Truth table: D C R | Q +//- -------+--- +//- - - 0 | 0 +//- d \ - | d +//- - - - | q +//- +module \$_DFF_NN0_ (D, C, R, Q); +input D, C, R; +output reg Q; +always @(negedge C or negedge R) begin + if (R == 0) + Q <= 0; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_NN1_ (D, C, R, Q) +//- +//- A negative edge D-type flip-flop with negative polarity set. +//- +//- Truth table: D C R | Q +//- -------+--- +//- - - 0 | 1 +//- d \ - | d +//- - - - | q +//- +module \$_DFF_NN1_ (D, C, R, Q); +input D, C, R; +output reg Q; +always @(negedge C or negedge R) begin + if (R == 0) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_NP0_ (D, C, R, Q) +//- +//- A negative edge D-type flip-flop with positive polarity reset. +//- +//- Truth table: D C R | Q +//- -------+--- +//- - - 1 | 0 +//- d \ - | d +//- - - - | q +//- +module \$_DFF_NP0_ (D, C, R, Q); +input D, C, R; +output reg Q; +always @(negedge C or posedge R) begin + if (R == 1) + Q <= 0; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_NP1_ (D, C, R, Q) +//- +//- A negative edge D-type flip-flop with positive polarity set. +//- +//- Truth table: D C R | Q +//- -------+--- +//- - - 1 | 1 +//- d \ - | d +//- - - - | q +//- +module \$_DFF_NP1_ (D, C, R, Q); +input D, C, R; +output reg Q; +always @(negedge C or posedge R) begin + if (R == 1) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_PN0_ (D, C, R, Q) +//- +//- A positive edge D-type flip-flop with negative polarity reset. +//- +//- Truth table: D C R | Q +//- -------+--- +//- - - 0 | 0 +//- d / - | d +//- - - - | q +//- +module \$_DFF_PN0_ (D, C, R, Q); +input D, C, R; +output reg Q; +always @(posedge C or negedge R) begin + if (R == 0) + Q <= 0; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_PN1_ (D, C, R, Q) +//- +//- A positive edge D-type flip-flop with negative polarity set. +//- +//- Truth table: D C R | Q +//- -------+--- +//- - - 0 | 1 +//- d / - | d +//- - - - | q +//- +module \$_DFF_PN1_ (D, C, R, Q); +input D, C, R; +output reg Q; +always @(posedge C or negedge R) begin + if (R == 0) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_PP0_ (D, C, R, Q) +//- +//- A positive edge D-type flip-flop with positive polarity reset. +//- +//- Truth table: D C R | Q +//- -------+--- +//- - - 1 | 0 +//- d / - | d +//- - - - | q +//- +module \$_DFF_PP0_ (D, C, R, Q); +input D, C, R; +output reg Q; +always @(posedge C or posedge R) begin + if (R == 1) + Q <= 0; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFF_PP1_ (D, C, R, Q) +//- +//- A positive edge D-type flip-flop with positive polarity set. +//- +//- Truth table: D C R | Q +//- -------+--- +//- - - 1 | 1 +//- d / - | d +//- - - - | q +//- +module \$_DFF_PP1_ (D, C, R, Q); +input D, C, R; +output reg Q; +always @(posedge C or posedge R) begin + if (R == 1) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFSR_NNN_ (C, S, R, D, Q) +//- +//- A negative edge D-type flip-flop with negative polarity set and reset. +//- +//- Truth table: C S R D | Q +//- ---------+--- +//- - - 0 - | 0 +//- - 0 - - | 1 +//- \ - - d | d +//- - - - - | q +//- +module \$_DFFSR_NNN_ (C, S, R, D, Q); +input C, S, R, D; +output reg Q; +always @(negedge C, negedge S, negedge R) begin + if (R == 0) + Q <= 0; + else if (S == 0) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFSR_NNP_ (C, S, R, D, Q) +//- +//- A negative edge D-type flip-flop with negative polarity set and positive +//- polarity reset. +//- +//- Truth table: C S R D | Q +//- ---------+--- +//- - - 1 - | 0 +//- - 0 - - | 1 +//- \ - - d | d +//- - - - - | q +//- +module \$_DFFSR_NNP_ (C, S, R, D, Q); +input C, S, R, D; +output reg Q; +always @(negedge C, negedge S, posedge R) begin + if (R == 1) + Q <= 0; + else if (S == 0) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFSR_NPN_ (C, S, R, D, Q) +//- +//- A negative edge D-type flip-flop with positive polarity set and negative +//- polarity reset. +//- +//- Truth table: C S R D | Q +//- ---------+--- +//- - - 0 - | 0 +//- - 1 - - | 1 +//- \ - - d | d +//- - - - - | q +//- +module \$_DFFSR_NPN_ (C, S, R, D, Q); +input C, S, R, D; +output reg Q; +always @(negedge C, posedge S, negedge R) begin + if (R == 0) + Q <= 0; + else if (S == 1) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFSR_NPP_ (C, S, R, D, Q) +//- +//- A negative edge D-type flip-flop with positive polarity set and reset. +//- +//- Truth table: C S R D | Q +//- ---------+--- +//- - - 1 - | 0 +//- - 1 - - | 1 +//- \ - - d | d +//- - - - - | q +//- +module \$_DFFSR_NPP_ (C, S, R, D, Q); +input C, S, R, D; +output reg Q; +always @(negedge C, posedge S, posedge R) begin + if (R == 1) + Q <= 0; + else if (S == 1) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFSR_PNN_ (C, S, R, D, Q) +//- +//- A positive edge D-type flip-flop with negative polarity set and reset. +//- +//- Truth table: C S R D | Q +//- ---------+--- +//- - - 0 - | 0 +//- - 0 - - | 1 +//- / - - d | d +//- - - - - | q +//- +module \$_DFFSR_PNN_ (C, S, R, D, Q); +input C, S, R, D; +output reg Q; +always @(posedge C, negedge S, negedge R) begin + if (R == 0) + Q <= 0; + else if (S == 0) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFSR_PNP_ (C, S, R, D, Q) +//- +//- A positive edge D-type flip-flop with negative polarity set and positive +//- polarity reset. +//- +//- Truth table: C S R D | Q +//- ---------+--- +//- - - 1 - | 0 +//- - 0 - - | 1 +//- / - - d | d +//- - - - - | q +//- +module \$_DFFSR_PNP_ (C, S, R, D, Q); +input C, S, R, D; +output reg Q; +always @(posedge C, negedge S, posedge R) begin + if (R == 1) + Q <= 0; + else if (S == 0) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFSR_PPN_ (C, S, R, D, Q) +//- +//- A positive edge D-type flip-flop with positive polarity set and negative +//- polarity reset. +//- +//- Truth table: C S R D | Q +//- ---------+--- +//- - - 0 - | 0 +//- - 1 - - | 1 +//- / - - d | d +//- - - - - | q +//- +module \$_DFFSR_PPN_ (C, S, R, D, Q); +input C, S, R, D; +output reg Q; +always @(posedge C, posedge S, negedge R) begin + if (R == 0) + Q <= 0; + else if (S == 1) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DFFSR_PPP_ (C, S, R, D, Q) +//- +//- A positive edge D-type flip-flop with positive polarity set and reset. +//- +//- Truth table: C S R D | Q +//- ---------+--- +//- - - 1 - | 0 +//- - 1 - - | 1 +//- / - - d | d +//- - - - - | q +//- +module \$_DFFSR_PPP_ (C, S, R, D, Q); +input C, S, R, D; +output reg Q; +always @(posedge C, posedge S, posedge R) begin + if (R == 1) + Q <= 0; + else if (S == 1) + Q <= 1; + else + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCH_N_ (E, D, Q) +//- +//- A negative enable D-type latch. +//- +//- Truth table: E D | Q +//- -----+--- +//- 0 d | d +//- - - | q +//- +module \$_DLATCH_N_ (E, D, Q); +input E, D; +output reg Q; +always @* begin + if (E == 0) + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCH_P_ (E, D, Q) +//- +//- A positive enable D-type latch. +//- +//- Truth table: E D | Q +//- -----+--- +//- 1 d | d +//- - - | q +//- +module \$_DLATCH_P_ (E, D, Q); +input E, D; +output reg Q; +always @* begin + if (E == 1) + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCHSR_NNN_ (E, S, R, D, Q) +//- +//- A negative enable D-type latch with negative polarity set and reset. +//- +//- Truth table: E S R D | Q +//- ---------+--- +//- - - 0 - | 0 +//- - 0 - - | 1 +//- 0 - - d | d +//- - - - - | q +//- +module \$_DLATCHSR_NNN_ (E, S, R, D, Q); +input E, S, R, D; +output reg Q; +always @* begin + if (R == 0) + Q <= 0; + else if (S == 0) + Q <= 1; + else if (E == 0) + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCHSR_NNP_ (E, S, R, D, Q) +//- +//- A negative enable D-type latch with negative polarity set and positive polarity +//- reset. +//- +//- Truth table: E S R D | Q +//- ---------+--- +//- - - 1 - | 0 +//- - 0 - - | 1 +//- 0 - - d | d +//- - - - - | q +//- +module \$_DLATCHSR_NNP_ (E, S, R, D, Q); +input E, S, R, D; +output reg Q; +always @* begin + if (R == 1) + Q <= 0; + else if (S == 0) + Q <= 1; + else if (E == 0) + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCHSR_NPN_ (E, S, R, D, Q) +//- +//- A negative enable D-type latch with positive polarity set and negative polarity +//- reset. +//- +//- Truth table: E S R D | Q +//- ---------+--- +//- - - 0 - | 0 +//- - 1 - - | 1 +//- 0 - - d | d +//- - - - - | q +//- +module \$_DLATCHSR_NPN_ (E, S, R, D, Q); +input E, S, R, D; +output reg Q; +always @* begin + if (R == 0) + Q <= 0; + else if (S == 1) + Q <= 1; + else if (E == 0) + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCHSR_NPP_ (E, S, R, D, Q) +//- +//- A negative enable D-type latch with positive polarity set and reset. +//- +//- Truth table: E S R D | Q +//- ---------+--- +//- - - 1 - | 0 +//- - 1 - - | 1 +//- 0 - - d | d +//- - - - - | q +//- +module \$_DLATCHSR_NPP_ (E, S, R, D, Q); +input E, S, R, D; +output reg Q; +always @* begin + if (R == 1) + Q <= 0; + else if (S == 1) + Q <= 1; + else if (E == 0) + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCHSR_PNN_ (E, S, R, D, Q) +//- +//- A positive enable D-type latch with negative polarity set and reset. +//- +//- Truth table: E S R D | Q +//- ---------+--- +//- - - 0 - | 0 +//- - 0 - - | 1 +//- 1 - - d | d +//- - - - - | q +//- +module \$_DLATCHSR_PNN_ (E, S, R, D, Q); +input E, S, R, D; +output reg Q; +always @* begin + if (R == 0) + Q <= 0; + else if (S == 0) + Q <= 1; + else if (E == 1) + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCHSR_PNP_ (E, S, R, D, Q) +//- +//- A positive enable D-type latch with negative polarity set and positive polarity +//- reset. +//- +//- Truth table: E S R D | Q +//- ---------+--- +//- - - 1 - | 0 +//- - 0 - - | 1 +//- 1 - - d | d +//- - - - - | q +//- +module \$_DLATCHSR_PNP_ (E, S, R, D, Q); +input E, S, R, D; +output reg Q; +always @* begin + if (R == 1) + Q <= 0; + else if (S == 0) + Q <= 1; + else if (E == 1) + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCHSR_PPN_ (E, S, R, D, Q) +//- +//- A positive enable D-type latch with positive polarity set and negative polarity +//- reset. +//- +//- Truth table: E S R D | Q +//- ---------+--- +//- - - 0 - | 0 +//- - 1 - - | 1 +//- 1 - - d | d +//- - - - - | q +//- +module \$_DLATCHSR_PPN_ (E, S, R, D, Q); +input E, S, R, D; +output reg Q; +always @* begin + if (R == 0) + Q <= 0; + else if (S == 1) + Q <= 1; + else if (E == 1) + Q <= D; +end +endmodule + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_DLATCHSR_PPP_ (E, S, R, D, Q) +//- +//- A positive enable D-type latch with positive polarity set and reset. +//- +//- Truth table: E S R D | Q +//- ---------+--- +//- - - 1 - | 0 +//- - 1 - - | 1 +//- 1 - - d | d +//- - - - - | q +//- +module \$_DLATCHSR_PPP_ (E, S, R, D, Q); +input E, S, R, D; +output reg Q; +always @* begin + if (R == 1) + Q <= 0; + else if (S == 1) + Q <= 1; + else if (E == 1) + Q <= D; +end +endmodule + diff --git a/verilog/windows/autoyosys/share/simlib.v b/verilog/windows/autoyosys/share/simlib.v new file mode 100644 index 0000000..2c4db1a --- /dev/null +++ b/verilog/windows/autoyosys/share/simlib.v @@ -0,0 +1,1818 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The Simulation Library. + * + * This Verilog library contains simple simulation models for the internal + * cells ($not, ...) generated by the frontends and used in most passes. + * + * This library can be used to verify the internal netlists as generated + * by the different frontends and passes. + * + * Note that memory can only be simulated when all $memrd and $memwr cells + * have been merged to stand-alone $mem cells (this is what the "memory_collect" + * pass is doing). + * + */ + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $not (A, Y) +//- +//- A bit-wise inverter. This corresponds to the Verilog unary prefix '~' operator. +//- +module \$not (A, Y); + +parameter A_SIGNED = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = ~$signed(A); + end else begin:BLOCK2 + assign Y = ~A; + end +endgenerate + +endmodule + + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $pos (A, Y) +//- +//- A buffer. This corresponds to the Verilog unary prefix '+' operator. +//- +module \$pos (A, Y); + +parameter A_SIGNED = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = $signed(A); + end else begin:BLOCK2 + assign Y = A; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $neg (A, Y) +//- +//- An arithmetic inverter. This corresponds to the Verilog unary prefix '-' operator. +//- +module \$neg (A, Y); + +parameter A_SIGNED = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = -$signed(A); + end else begin:BLOCK2 + assign Y = -A; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $and (A, B, Y) +//- +//- A bit-wise AND. This corresponds to the Verilog '&' operator. +//- +module \$and (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) & $signed(B); + end else begin:BLOCK2 + assign Y = A & B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $or (A, B, Y) +//- +//- A bit-wise OR. This corresponds to the Verilog '|' operator. +//- +module \$or (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) | $signed(B); + end else begin:BLOCK2 + assign Y = A | B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $xor (A, B, Y) +//- +//- A bit-wise XOR. This corresponds to the Verilog '^' operator. +//- +module \$xor (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) ^ $signed(B); + end else begin:BLOCK2 + assign Y = A ^ B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $xnor (A, B, Y) +//- +//- A bit-wise XNOR. This corresponds to the Verilog '~^' operator. +//- +module \$xnor (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) ~^ $signed(B); + end else begin:BLOCK2 + assign Y = A ~^ B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $reduce_and (A, B, Y) +//- +//- An AND reduction. This corresponds to the Verilog unary prefix '&' operator. +//- +module \$reduce_and (A, Y); + +parameter A_SIGNED = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = &$signed(A); + end else begin:BLOCK2 + assign Y = &A; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $reduce_or (A, B, Y) +//- +//- An OR reduction. This corresponds to the Verilog unary prefix '|' operator. +//- +module \$reduce_or (A, Y); + +parameter A_SIGNED = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = |$signed(A); + end else begin:BLOCK2 + assign Y = |A; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $reduce_xor (A, B, Y) +//- +//- A XOR reduction. This corresponds to the Verilog unary prefix '^' operator. +//- +module \$reduce_xor (A, Y); + +parameter A_SIGNED = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = ^$signed(A); + end else begin:BLOCK2 + assign Y = ^A; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $reduce_xnor (A, B, Y) +//- +//- A XNOR reduction. This corresponds to the Verilog unary prefix '~^' operator. +//- +module \$reduce_xnor (A, Y); + +parameter A_SIGNED = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = ~^$signed(A); + end else begin:BLOCK2 + assign Y = ~^A; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $reduce_bool (A, B, Y) +//- +//- An OR reduction. This cell type is used instead of $reduce_or when a signal is +//- implicitly converted to a boolean signal, e.g. for operands of '&&' and '||'. +//- +module \$reduce_bool (A, Y); + +parameter A_SIGNED = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = !(!$signed(A)); + end else begin:BLOCK2 + assign Y = !(!A); + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$shl (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = $signed(A) << B; + end else begin:BLOCK2 + assign Y = A << B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$shr (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = $signed(A) >> B; + end else begin:BLOCK2 + assign Y = A >> B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$sshl (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = $signed(A) <<< B; + end else begin:BLOCK2 + assign Y = A <<< B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$sshr (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = $signed(A) >>> B; + end else begin:BLOCK2 + assign Y = A >>> B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$shift (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (B_SIGNED) begin:BLOCK1 + assign Y = $signed(B) < 0 ? A << -B : A >> B; + end else begin:BLOCK2 + assign Y = A >> B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$shiftx (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (Y_WIDTH > 0) + if (B_SIGNED) begin:BLOCK1 + assign Y = A[$signed(B) +: Y_WIDTH]; + end else begin:BLOCK2 + assign Y = A[B +: Y_WIDTH]; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$fa (A, B, C, X, Y); + +parameter WIDTH = 1; + +input [WIDTH-1:0] A, B, C; +output [WIDTH-1:0] X, Y; + +wire [WIDTH-1:0] t1, t2, t3; + +assign t1 = A ^ B, t2 = A & B, t3 = C & t1; +assign Y = t1 ^ C, X = (t2 | t3) ^ (Y ^ Y); + +endmodule + +// -------------------------------------------------------- + +module \$lcu (P, G, CI, CO); + +parameter WIDTH = 1; + +input [WIDTH-1:0] P, G; +input CI; + +output reg [WIDTH-1:0] CO; + +integer i; +always @* begin + CO = 'bx; + if (^{P, G, CI} !== 1'bx) begin + CO[0] = G[0] || (P[0] && CI); + for (i = 1; i < WIDTH; i = i+1) + CO[i] = G[i] || (P[i] && CO[i-1]); + end +end + +endmodule + +// -------------------------------------------------------- + +module \$alu (A, B, CI, BI, X, Y, CO); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 1; +parameter B_WIDTH = 1; +parameter Y_WIDTH = 1; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] X, Y; + +input CI, BI; +output [Y_WIDTH-1:0] CO; + +wire [Y_WIDTH-1:0] AA, BB; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign AA = $signed(A), BB = BI ? ~$signed(B) : $signed(B); + end else begin:BLOCK2 + assign AA = $unsigned(A), BB = BI ? ~$unsigned(B) : $unsigned(B); + end +endgenerate + +// this is 'x' if Y and CO should be all 'x', and '0' otherwise +wire y_co_undef = ^{A, A, B, B, CI, CI, BI, BI}; + +assign X = AA ^ BB; +assign Y = (AA + BB + CI) ^ {Y_WIDTH{y_co_undef}}; + +function get_carry; + input a, b, c; + get_carry = (a&b) | (a&c) | (b&c); +endfunction + +genvar i; +generate + assign CO[0] = get_carry(AA[0], BB[0], CI) ^ y_co_undef; + for (i = 1; i < Y_WIDTH; i = i+1) begin:BLOCK3 + assign CO[i] = get_carry(AA[i], BB[i], CO[i-1]) ^ y_co_undef; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$lt (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) < $signed(B); + end else begin:BLOCK2 + assign Y = A < B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$le (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) <= $signed(B); + end else begin:BLOCK2 + assign Y = A <= B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$eq (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) == $signed(B); + end else begin:BLOCK2 + assign Y = A == B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$ne (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) != $signed(B); + end else begin:BLOCK2 + assign Y = A != B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$eqx (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) === $signed(B); + end else begin:BLOCK2 + assign Y = A === B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$nex (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) !== $signed(B); + end else begin:BLOCK2 + assign Y = A !== B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$ge (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) >= $signed(B); + end else begin:BLOCK2 + assign Y = A >= B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$gt (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) > $signed(B); + end else begin:BLOCK2 + assign Y = A > B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$add (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) + $signed(B); + end else begin:BLOCK2 + assign Y = A + B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$sub (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) - $signed(B); + end else begin:BLOCK2 + assign Y = A - B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$mul (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) * $signed(B); + end else begin:BLOCK2 + assign Y = A * B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$macc (A, B, Y); + +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; +parameter CONFIG = 4'b0000; +parameter CONFIG_WIDTH = 4; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output reg [Y_WIDTH-1:0] Y; + +// Xilinx XSIM does not like $clog2() below.. +function integer my_clog2; + input integer v; + begin + if (v > 0) + v = v - 1; + my_clog2 = 0; + while (v) begin + v = v >> 1; + my_clog2 = my_clog2 + 1; + end + end +endfunction + +localparam integer num_bits = CONFIG[3:0] > 0 ? CONFIG[3:0] : 1; +localparam integer num_ports = (CONFIG_WIDTH-4) / (2 + 2*num_bits); +localparam integer num_abits = my_clog2(A_WIDTH) > 0 ? my_clog2(A_WIDTH) : 1; + +function [2*num_ports*num_abits-1:0] get_port_offsets; + input [CONFIG_WIDTH-1:0] cfg; + integer i, cursor; + begin + cursor = 0; + get_port_offsets = 0; + for (i = 0; i < num_ports; i = i+1) begin + get_port_offsets[(2*i + 0)*num_abits +: num_abits] = cursor; + cursor = cursor + cfg[4 + i*(2 + 2*num_bits) + 2 +: num_bits]; + get_port_offsets[(2*i + 1)*num_abits +: num_abits] = cursor; + cursor = cursor + cfg[4 + i*(2 + 2*num_bits) + 2 + num_bits +: num_bits]; + end + end +endfunction + +localparam [2*num_ports*num_abits-1:0] port_offsets = get_port_offsets(CONFIG); + +`define PORT_IS_SIGNED (0 + CONFIG[4 + i*(2 + 2*num_bits)]) +`define PORT_DO_SUBTRACT (0 + CONFIG[4 + i*(2 + 2*num_bits) + 1]) +`define PORT_SIZE_A (0 + CONFIG[4 + i*(2 + 2*num_bits) + 2 +: num_bits]) +`define PORT_SIZE_B (0 + CONFIG[4 + i*(2 + 2*num_bits) + 2 + num_bits +: num_bits]) +`define PORT_OFFSET_A (0 + port_offsets[2*i*num_abits +: num_abits]) +`define PORT_OFFSET_B (0 + port_offsets[2*i*num_abits + num_abits +: num_abits]) + +integer i, j; +reg [Y_WIDTH-1:0] tmp_a, tmp_b; + +always @* begin + Y = 0; + for (i = 0; i < num_ports; i = i+1) + begin + tmp_a = 0; + tmp_b = 0; + + for (j = 0; j < `PORT_SIZE_A; j = j+1) + tmp_a[j] = A[`PORT_OFFSET_A + j]; + + if (`PORT_IS_SIGNED && `PORT_SIZE_A > 0) + for (j = `PORT_SIZE_A; j < Y_WIDTH; j = j+1) + tmp_a[j] = tmp_a[`PORT_SIZE_A-1]; + + for (j = 0; j < `PORT_SIZE_B; j = j+1) + tmp_b[j] = A[`PORT_OFFSET_B + j]; + + if (`PORT_IS_SIGNED && `PORT_SIZE_B > 0) + for (j = `PORT_SIZE_B; j < Y_WIDTH; j = j+1) + tmp_b[j] = tmp_b[`PORT_SIZE_B-1]; + + if (`PORT_SIZE_B > 0) + tmp_a = tmp_a * tmp_b; + + if (`PORT_DO_SUBTRACT) + Y = Y - tmp_a; + else + Y = Y + tmp_a; + end + for (i = 0; i < B_WIDTH; i = i+1) begin + Y = Y + B[i]; + end +end + +`undef PORT_IS_SIGNED +`undef PORT_DO_SUBTRACT +`undef PORT_SIZE_A +`undef PORT_SIZE_B +`undef PORT_OFFSET_A +`undef PORT_OFFSET_B + +endmodule + +// -------------------------------------------------------- + +module \$div (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) / $signed(B); + end else begin:BLOCK2 + assign Y = A / B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$mod (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) % $signed(B); + end else begin:BLOCK2 + assign Y = A % B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- +`ifndef SIMLIB_NOPOW + +module \$pow (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) ** $signed(B); + end else if (A_SIGNED) begin:BLOCK2 + assign Y = $signed(A) ** B; + end else if (B_SIGNED) begin:BLOCK3 + assign Y = A ** $signed(B); + end else begin:BLOCK4 + assign Y = A ** B; + end +endgenerate + +endmodule + +`endif +// -------------------------------------------------------- + +module \$logic_not (A, Y); + +parameter A_SIGNED = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED) begin:BLOCK1 + assign Y = !$signed(A); + end else begin:BLOCK2 + assign Y = !A; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$logic_and (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) && $signed(B); + end else begin:BLOCK2 + assign Y = A && B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$logic_or (A, B, Y); + +parameter A_SIGNED = 0; +parameter B_SIGNED = 0; +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [Y_WIDTH-1:0] Y; + +generate + if (A_SIGNED && B_SIGNED) begin:BLOCK1 + assign Y = $signed(A) || $signed(B); + end else begin:BLOCK2 + assign Y = A || B; + end +endgenerate + +endmodule + +// -------------------------------------------------------- + +module \$slice (A, Y); + +parameter OFFSET = 0; +parameter A_WIDTH = 0; +parameter Y_WIDTH = 0; + +input [A_WIDTH-1:0] A; +output [Y_WIDTH-1:0] Y; + +assign Y = A >> OFFSET; + +endmodule + +// -------------------------------------------------------- + +module \$concat (A, B, Y); + +parameter A_WIDTH = 0; +parameter B_WIDTH = 0; + +input [A_WIDTH-1:0] A; +input [B_WIDTH-1:0] B; +output [A_WIDTH+B_WIDTH-1:0] Y; + +assign Y = {B, A}; + +endmodule + +// -------------------------------------------------------- + +module \$mux (A, B, S, Y); + +parameter WIDTH = 0; + +input [WIDTH-1:0] A, B; +input S; +output reg [WIDTH-1:0] Y; + +always @* begin + if (S) + Y = B; + else + Y = A; +end + +endmodule + +// -------------------------------------------------------- + +module \$pmux (A, B, S, Y); + +parameter WIDTH = 0; +parameter S_WIDTH = 0; + +input [WIDTH-1:0] A; +input [WIDTH*S_WIDTH-1:0] B; +input [S_WIDTH-1:0] S; +output reg [WIDTH-1:0] Y; + +integer i; +reg found_active_sel_bit; + +always @* begin + Y = A; + found_active_sel_bit = 0; + for (i = 0; i < S_WIDTH; i = i+1) + if (S[i]) begin + Y = found_active_sel_bit ? 'bx : B >> (WIDTH*i); + found_active_sel_bit = 1; + end +end + +endmodule + +// -------------------------------------------------------- +`ifndef SIMLIB_NOLUT + +module \$lut (A, Y); + +parameter WIDTH = 0; +parameter LUT = 0; + +input [WIDTH-1:0] A; +output reg Y; + +wire lut0_out, lut1_out; + +generate + if (WIDTH <= 1) begin:simple + assign {lut1_out, lut0_out} = LUT; + end else begin:complex + \$lut #( .WIDTH(WIDTH-1), .LUT(LUT ) ) lut0 ( .A(A[WIDTH-2:0]), .Y(lut0_out) ); + \$lut #( .WIDTH(WIDTH-1), .LUT(LUT >> (2**(WIDTH-1))) ) lut1 ( .A(A[WIDTH-2:0]), .Y(lut1_out) ); + end + + if (WIDTH > 0) begin:lutlogic + always @* begin + casez ({A[WIDTH-1], lut0_out, lut1_out}) + 3'b?11: Y = 1'b1; + 3'b?00: Y = 1'b0; + 3'b0??: Y = lut0_out; + 3'b1??: Y = lut1_out; + default: Y = 1'bx; + endcase + end + end +endgenerate + +endmodule + +`endif +// -------------------------------------------------------- + +module \$sop (A, Y); + +parameter WIDTH = 0; +parameter DEPTH = 0; +parameter TABLE = 0; + +input [WIDTH-1:0] A; +output reg Y; + +integer i, j; +reg match; + +always @* begin + Y = 0; + for (i = 0; i < DEPTH; i=i+1) begin + match = 1; + for (j = 0; j < WIDTH; j=j+1) begin + if (TABLE[2*WIDTH*i + 2*j + 0] && A[j]) match = 0; + if (TABLE[2*WIDTH*i + 2*j + 1] && !A[j]) match = 0; + end + if (match) Y = 1; + end +end + +endmodule + +// -------------------------------------------------------- + +module \$tribuf (A, EN, Y); + +parameter WIDTH = 0; + +input [WIDTH-1:0] A; +input EN; +output [WIDTH-1:0] Y; + +assign Y = EN ? A : 'bz; + +endmodule + +// -------------------------------------------------------- + +module \$assert (A, EN); + +input A, EN; + +`ifndef SIMLIB_NOCHECKS +always @* begin + if (A !== 1'b1 && EN === 1'b1) begin + $display("Assertion %m failed!"); + $stop; + end +end +`endif + +endmodule + +// -------------------------------------------------------- + +module \$assume (A, EN); + +input A, EN; + +`ifndef SIMLIB_NOCHECKS +always @* begin + if (A !== 1'b1 && EN === 1'b1) begin + $display("Assumption %m failed!"); + $stop; + end +end +`endif + +endmodule + +// -------------------------------------------------------- + +module \$initstate (Y); + +output reg Y = 1; +reg [3:0] cnt = 1; +reg trig = 0; + +initial trig <= 1; + +always @(cnt, trig) begin + Y <= |cnt; + cnt <= cnt + |cnt; +end + +endmodule + +// -------------------------------------------------------- + +module \$anyconst (Y); + +parameter WIDTH = 0; + +output [WIDTH-1:0] Y; + +assign Y = 'bx; + +endmodule + +// -------------------------------------------------------- + +module \$anyseq (Y); + +parameter WIDTH = 0; + +output [WIDTH-1:0] Y; + +assign Y = 'bx; + +endmodule + +// -------------------------------------------------------- + +module \$equiv (A, B, Y); + +input A, B; +output Y; + +assign Y = (A !== 1'bx && A !== B) ? 1'bx : A; + +`ifndef SIMLIB_NOCHECKS +always @* begin + if (A !== 1'bx && A !== B) begin + $display("Equivalence failed!"); + $stop; + end +end +`endif + +endmodule + +// -------------------------------------------------------- +`ifndef SIMLIB_NOSR + +module \$sr (SET, CLR, Q); + +parameter WIDTH = 0; +parameter SET_POLARITY = 1'b1; +parameter CLR_POLARITY = 1'b1; + +input [WIDTH-1:0] SET, CLR; +output reg [WIDTH-1:0] Q; + +wire [WIDTH-1:0] pos_set = SET_POLARITY ? SET : ~SET; +wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR; + +genvar i; +generate + for (i = 0; i < WIDTH; i = i+1) begin:bitslices + always @(posedge pos_set[i], posedge pos_clr[i]) + if (pos_clr[i]) + Q[i] <= 0; + else if (pos_set[i]) + Q[i] <= 1; + end +endgenerate + +endmodule + +`endif +// -------------------------------------------------------- +`ifdef SIMLIB_FF + +module \$ff (D, Q); + +parameter WIDTH = 0; + +input [WIDTH-1:0] D; +output reg [WIDTH-1:0] Q; + +always @($global_clk) begin + Q <= D; +end + +endmodule + +`endif +// -------------------------------------------------------- + +module \$dff (CLK, D, Q); + +parameter WIDTH = 0; +parameter CLK_POLARITY = 1'b1; + +input CLK; +input [WIDTH-1:0] D; +output reg [WIDTH-1:0] Q; +wire pos_clk = CLK == CLK_POLARITY; + +always @(posedge pos_clk) begin + Q <= D; +end + +endmodule + +// -------------------------------------------------------- + +module \$dffe (CLK, EN, D, Q); + +parameter WIDTH = 0; +parameter CLK_POLARITY = 1'b1; +parameter EN_POLARITY = 1'b1; + +input CLK, EN; +input [WIDTH-1:0] D; +output reg [WIDTH-1:0] Q; +wire pos_clk = CLK == CLK_POLARITY; + +always @(posedge pos_clk) begin + if (EN == EN_POLARITY) Q <= D; +end + +endmodule + +// -------------------------------------------------------- +`ifndef SIMLIB_NOSR + +module \$dffsr (CLK, SET, CLR, D, Q); + +parameter WIDTH = 0; +parameter CLK_POLARITY = 1'b1; +parameter SET_POLARITY = 1'b1; +parameter CLR_POLARITY = 1'b1; + +input CLK; +input [WIDTH-1:0] SET, CLR, D; +output reg [WIDTH-1:0] Q; + +wire pos_clk = CLK == CLK_POLARITY; +wire [WIDTH-1:0] pos_set = SET_POLARITY ? SET : ~SET; +wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR; + +genvar i; +generate + for (i = 0; i < WIDTH; i = i+1) begin:bitslices + always @(posedge pos_set[i], posedge pos_clr[i], posedge pos_clk) + if (pos_clr[i]) + Q[i] <= 0; + else if (pos_set[i]) + Q[i] <= 1; + else + Q[i] <= D[i]; + end +endgenerate + +endmodule + +`endif +// -------------------------------------------------------- + +module \$adff (CLK, ARST, D, Q); + +parameter WIDTH = 0; +parameter CLK_POLARITY = 1'b1; +parameter ARST_POLARITY = 1'b1; +parameter ARST_VALUE = 0; + +input CLK, ARST; +input [WIDTH-1:0] D; +output reg [WIDTH-1:0] Q; +wire pos_clk = CLK == CLK_POLARITY; +wire pos_arst = ARST == ARST_POLARITY; + +always @(posedge pos_clk, posedge pos_arst) begin + if (pos_arst) + Q <= ARST_VALUE; + else + Q <= D; +end + +endmodule + +// -------------------------------------------------------- + +module \$dlatch (EN, D, Q); + +parameter WIDTH = 0; +parameter EN_POLARITY = 1'b1; + +input EN; +input [WIDTH-1:0] D; +output reg [WIDTH-1:0] Q; + +always @* begin + if (EN == EN_POLARITY) + Q = D; +end + +endmodule + +// -------------------------------------------------------- +`ifndef SIMLIB_NOSR + +module \$dlatchsr (EN, SET, CLR, D, Q); + +parameter WIDTH = 0; +parameter EN_POLARITY = 1'b1; +parameter SET_POLARITY = 1'b1; +parameter CLR_POLARITY = 1'b1; + +input EN; +input [WIDTH-1:0] SET, CLR, D; +output reg [WIDTH-1:0] Q; + +wire pos_en = EN == EN_POLARITY; +wire [WIDTH-1:0] pos_set = SET_POLARITY ? SET : ~SET; +wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR; + +genvar i; +generate + for (i = 0; i < WIDTH; i = i+1) begin:bitslices + always @* + if (pos_clr[i]) + Q[i] = 0; + else if (pos_set[i]) + Q[i] = 1; + else if (pos_en) + Q[i] = D[i]; + end +endgenerate + +endmodule + +`endif +// -------------------------------------------------------- + +module \$fsm (CLK, ARST, CTRL_IN, CTRL_OUT); + +parameter NAME = ""; + +parameter CLK_POLARITY = 1'b1; +parameter ARST_POLARITY = 1'b1; + +parameter CTRL_IN_WIDTH = 1; +parameter CTRL_OUT_WIDTH = 1; + +parameter STATE_BITS = 1; +parameter STATE_NUM = 1; +parameter STATE_NUM_LOG2 = 1; +parameter STATE_RST = 0; +parameter STATE_TABLE = 1'b0; + +parameter TRANS_NUM = 1; +parameter TRANS_TABLE = 4'b0x0x; + +input CLK, ARST; +input [CTRL_IN_WIDTH-1:0] CTRL_IN; +output reg [CTRL_OUT_WIDTH-1:0] CTRL_OUT; + +wire pos_clk = CLK == CLK_POLARITY; +wire pos_arst = ARST == ARST_POLARITY; + +reg [STATE_BITS-1:0] state; +reg [STATE_BITS-1:0] state_tmp; +reg [STATE_BITS-1:0] next_state; + +reg [STATE_BITS-1:0] tr_state_in; +reg [STATE_BITS-1:0] tr_state_out; +reg [CTRL_IN_WIDTH-1:0] tr_ctrl_in; +reg [CTRL_OUT_WIDTH-1:0] tr_ctrl_out; + +integer i; + +task tr_fetch; + input [31:0] tr_num; + reg [31:0] tr_pos; + reg [STATE_NUM_LOG2-1:0] state_num; + begin + tr_pos = (2*STATE_NUM_LOG2+CTRL_IN_WIDTH+CTRL_OUT_WIDTH)*tr_num; + tr_ctrl_out = TRANS_TABLE >> tr_pos; + tr_pos = tr_pos + CTRL_OUT_WIDTH; + state_num = TRANS_TABLE >> tr_pos; + tr_state_out = STATE_TABLE >> (STATE_BITS*state_num); + tr_pos = tr_pos + STATE_NUM_LOG2; + tr_ctrl_in = TRANS_TABLE >> tr_pos; + tr_pos = tr_pos + CTRL_IN_WIDTH; + state_num = TRANS_TABLE >> tr_pos; + tr_state_in = STATE_TABLE >> (STATE_BITS*state_num); + tr_pos = tr_pos + STATE_NUM_LOG2; + end +endtask + +always @(posedge pos_clk, posedge pos_arst) begin + if (pos_arst) begin + state_tmp = STATE_TABLE[STATE_BITS*(STATE_RST+1)-1:STATE_BITS*STATE_RST]; + for (i = 0; i < STATE_BITS; i = i+1) + if (state_tmp[i] === 1'bz) + state_tmp[i] = 0; + state <= state_tmp; + end else begin + state_tmp = next_state; + for (i = 0; i < STATE_BITS; i = i+1) + if (state_tmp[i] === 1'bz) + state_tmp[i] = 0; + state <= state_tmp; + end +end + +always @(state, CTRL_IN) begin + next_state <= STATE_TABLE[STATE_BITS*(STATE_RST+1)-1:STATE_BITS*STATE_RST]; + CTRL_OUT <= 'bx; + // $display("---"); + // $display("Q: %b %b", state, CTRL_IN); + for (i = 0; i < TRANS_NUM; i = i+1) begin + tr_fetch(i); + // $display("T: %b %b -> %b %b [%d]", tr_state_in, tr_ctrl_in, tr_state_out, tr_ctrl_out, i); + casez ({state, CTRL_IN}) + {tr_state_in, tr_ctrl_in}: begin + // $display("-> %b %b <- MATCH", state, CTRL_IN); + {next_state, CTRL_OUT} <= {tr_state_out, tr_ctrl_out}; + end + endcase + end +end + +endmodule + +// -------------------------------------------------------- +`ifndef SIMLIB_NOMEM + +module \$memrd (CLK, EN, ADDR, DATA); + +parameter MEMID = ""; +parameter ABITS = 8; +parameter WIDTH = 8; + +parameter CLK_ENABLE = 0; +parameter CLK_POLARITY = 0; +parameter TRANSPARENT = 0; + +input CLK, EN; +input [ABITS-1:0] ADDR; +output [WIDTH-1:0] DATA; + +initial begin + if (MEMID != "") begin + $display("ERROR: Found non-simulatable instance of $memrd!"); + $finish; + end +end + +endmodule + +// -------------------------------------------------------- + +module \$memwr (CLK, EN, ADDR, DATA); + +parameter MEMID = ""; +parameter ABITS = 8; +parameter WIDTH = 8; + +parameter CLK_ENABLE = 0; +parameter CLK_POLARITY = 0; +parameter PRIORITY = 0; + +input CLK; +input [WIDTH-1:0] EN; +input [ABITS-1:0] ADDR; +input [WIDTH-1:0] DATA; + +initial begin + if (MEMID != "") begin + $display("ERROR: Found non-simulatable instance of $memwr!"); + $finish; + end +end + +endmodule + +// -------------------------------------------------------- + +module \$meminit (ADDR, DATA); + +parameter MEMID = ""; +parameter ABITS = 8; +parameter WIDTH = 8; +parameter WORDS = 1; + +parameter PRIORITY = 0; + +input [ABITS-1:0] ADDR; +input [WORDS*WIDTH-1:0] DATA; + +initial begin + if (MEMID != "") begin + $display("ERROR: Found non-simulatable instance of $meminit!"); + $finish; + end +end + +endmodule + +// -------------------------------------------------------- + +module \$mem (RD_CLK, RD_EN, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA); + +parameter MEMID = ""; +parameter signed SIZE = 4; +parameter signed OFFSET = 0; +parameter signed ABITS = 2; +parameter signed WIDTH = 8; +parameter signed INIT = 1'bx; + +parameter signed RD_PORTS = 1; +parameter RD_CLK_ENABLE = 1'b1; +parameter RD_CLK_POLARITY = 1'b1; +parameter RD_TRANSPARENT = 1'b1; + +parameter signed WR_PORTS = 1; +parameter WR_CLK_ENABLE = 1'b1; +parameter WR_CLK_POLARITY = 1'b1; + +input [RD_PORTS-1:0] RD_CLK; +input [RD_PORTS-1:0] RD_EN; +input [RD_PORTS*ABITS-1:0] RD_ADDR; +output reg [RD_PORTS*WIDTH-1:0] RD_DATA; + +input [WR_PORTS-1:0] WR_CLK; +input [WR_PORTS*WIDTH-1:0] WR_EN; +input [WR_PORTS*ABITS-1:0] WR_ADDR; +input [WR_PORTS*WIDTH-1:0] WR_DATA; + +reg [WIDTH-1:0] memory [SIZE-1:0]; + +integer i, j; +reg [WR_PORTS-1:0] LAST_WR_CLK; +reg [RD_PORTS-1:0] LAST_RD_CLK; + +function port_active; + input clk_enable; + input clk_polarity; + input last_clk; + input this_clk; + begin + casez ({clk_enable, clk_polarity, last_clk, this_clk}) + 4'b0???: port_active = 1; + 4'b1101: port_active = 1; + 4'b1010: port_active = 1; + default: port_active = 0; + endcase + end +endfunction + +initial begin + for (i = 0; i < SIZE; i = i+1) + memory[i] = INIT >>> (i*WIDTH); +end + +always @(RD_CLK, RD_ADDR, RD_DATA, WR_CLK, WR_EN, WR_ADDR, WR_DATA) begin +`ifdef SIMLIB_MEMDELAY + #`SIMLIB_MEMDELAY; +`endif + for (i = 0; i < RD_PORTS; i = i+1) begin + if (!RD_TRANSPARENT[i] && RD_CLK_ENABLE[i] && RD_EN[i] && port_active(RD_CLK_ENABLE[i], RD_CLK_POLARITY[i], LAST_RD_CLK[i], RD_CLK[i])) begin + // $display("Read from %s: addr=%b data=%b", MEMID, RD_ADDR[i*ABITS +: ABITS], memory[RD_ADDR[i*ABITS +: ABITS] - OFFSET]); + RD_DATA[i*WIDTH +: WIDTH] <= memory[RD_ADDR[i*ABITS +: ABITS] - OFFSET]; + end + end + + for (i = 0; i < WR_PORTS; i = i+1) begin + if (port_active(WR_CLK_ENABLE[i], WR_CLK_POLARITY[i], LAST_WR_CLK[i], WR_CLK[i])) + for (j = 0; j < WIDTH; j = j+1) + if (WR_EN[i*WIDTH+j]) begin + // $display("Write to %s: addr=%b data=%b", MEMID, WR_ADDR[i*ABITS +: ABITS], WR_DATA[i*WIDTH+j]); + memory[WR_ADDR[i*ABITS +: ABITS] - OFFSET][j] = WR_DATA[i*WIDTH+j]; + end + end + + for (i = 0; i < RD_PORTS; i = i+1) begin + if ((RD_TRANSPARENT[i] || !RD_CLK_ENABLE[i]) && port_active(RD_CLK_ENABLE[i], RD_CLK_POLARITY[i], LAST_RD_CLK[i], RD_CLK[i])) begin + // $display("Transparent read from %s: addr=%b data=%b", MEMID, RD_ADDR[i*ABITS +: ABITS], memory[RD_ADDR[i*ABITS +: ABITS] - OFFSET]); + RD_DATA[i*WIDTH +: WIDTH] <= memory[RD_ADDR[i*ABITS +: ABITS] - OFFSET]; + end + end + + LAST_RD_CLK <= RD_CLK; + LAST_WR_CLK <= WR_CLK; +end + +endmodule + +`endif +// -------------------------------------------------------- diff --git a/verilog/windows/autoyosys/share/techmap.v b/verilog/windows/autoyosys/share/techmap.v new file mode 100644 index 0000000..d7ec394 --- /dev/null +++ b/verilog/windows/autoyosys/share/techmap.v @@ -0,0 +1,459 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * --- + * + * The internal logic cell technology mapper. + * + * This Verilog library contains the mapping of internal cells (e.g. $not with + * variable bit width) to the internal logic cells (such as the single bit $_NOT_ + * gate). Usually this logic network is then mapped to the actual technology + * using e.g. the "abc" pass. + * + * Note that this library does not map $mem cells. They must be mapped to logic + * and $dff cells using the "memory_map" pass first. (Or map it to custom cells, + * which is of course highly recommended for larger memories.) + * + */ + +`define MIN(_a, _b) ((_a) < (_b) ? (_a) : (_b)) +`define MAX(_a, _b) ((_a) > (_b) ? (_a) : (_b)) + + +// -------------------------------------------------------- +// Use simplemap for trivial cell types +// -------------------------------------------------------- + +(* techmap_simplemap *) +(* techmap_celltype = "$not $and $or $xor $xnor" *) +module _90_simplemap_bool_ops; +endmodule + +(* techmap_simplemap *) +(* techmap_celltype = "$reduce_and $reduce_or $reduce_xor $reduce_xnor $reduce_bool" *) +module _90_simplemap_reduce_ops; +endmodule + +(* techmap_simplemap *) +(* techmap_celltype = "$logic_not $logic_and $logic_or" *) +module _90_simplemap_logic_ops; +endmodule + +(* techmap_simplemap *) +(* techmap_celltype = "$eq $eqx $ne $nex" *) +module _90_simplemap_compare_ops; +endmodule + +(* techmap_simplemap *) +(* techmap_celltype = "$pos $slice $concat $mux $tribuf" *) +module _90_simplemap_various; +endmodule + +(* techmap_simplemap *) +(* techmap_celltype = "$sr $ff $dff $dffe $adff $dffsr $dlatch" *) +module _90_simplemap_registers; +endmodule + + +// -------------------------------------------------------- +// Shift operators +// -------------------------------------------------------- + +(* techmap_celltype = "$shr $shl $sshl $sshr" *) +module _90_shift_ops_shr_shl_sshl_sshr (A, B, Y); + parameter A_SIGNED = 0; + parameter B_SIGNED = 0; + parameter A_WIDTH = 1; + parameter B_WIDTH = 1; + parameter Y_WIDTH = 1; + + parameter _TECHMAP_CELLTYPE_ = ""; + localparam shift_left = _TECHMAP_CELLTYPE_ == "$shl" || _TECHMAP_CELLTYPE_ == "$sshl"; + localparam sign_extend = A_SIGNED && _TECHMAP_CELLTYPE_ == "$sshr"; + + input [A_WIDTH-1:0] A; + input [B_WIDTH-1:0] B; + output [Y_WIDTH-1:0] Y; + + localparam WIDTH = `MAX(A_WIDTH, Y_WIDTH); + localparam BB_WIDTH = `MIN($clog2(shift_left ? Y_WIDTH : A_SIGNED ? WIDTH : A_WIDTH) + 1, B_WIDTH); + + wire [1023:0] _TECHMAP_DO_00_ = "proc;;"; + wire [1023:0] _TECHMAP_DO_01_ = "RECURSION; CONSTMAP; opt_muxtree; opt_expr -mux_undef -mux_bool -fine;;;"; + + integer i; + reg [WIDTH-1:0] buffer; + reg overflow; + + always @* begin + overflow = B_WIDTH > BB_WIDTH ? |B[B_WIDTH-1:BB_WIDTH] : 1'b0; + buffer = overflow ? {WIDTH{sign_extend ? A[A_WIDTH-1] : 1'b0}} : {{WIDTH-A_WIDTH{A_SIGNED ? A[A_WIDTH-1] : 1'b0}}, A}; + + for (i = 0; i < BB_WIDTH; i = i+1) + if (B[i]) begin + if (shift_left) + buffer = {buffer, (2**i)'b0}; + else if (2**i < WIDTH) + buffer = {{2**i{sign_extend ? buffer[WIDTH-1] : 1'b0}}, buffer[WIDTH-1 : 2**i]}; + else + buffer = {WIDTH{sign_extend ? buffer[WIDTH-1] : 1'b0}}; + end + end + + assign Y = buffer; +endmodule + +(* techmap_celltype = "$shift $shiftx" *) +module _90_shift_shiftx (A, B, Y); + parameter A_SIGNED = 0; + parameter B_SIGNED = 0; + parameter A_WIDTH = 1; + parameter B_WIDTH = 1; + parameter Y_WIDTH = 1; + + input [A_WIDTH-1:0] A; + input [B_WIDTH-1:0] B; + output [Y_WIDTH-1:0] Y; + + localparam BB_WIDTH = `MIN($clog2(`MAX(A_WIDTH, Y_WIDTH)) + (B_SIGNED ? 2 : 1), B_WIDTH); + localparam WIDTH = `MAX(A_WIDTH, Y_WIDTH) + (B_SIGNED ? 2**(BB_WIDTH-1) : 0); + + parameter _TECHMAP_CELLTYPE_ = ""; + localparam extbit = _TECHMAP_CELLTYPE_ == "$shift" ? 1'b0 : 1'bx; + + wire [1023:0] _TECHMAP_DO_00_ = "proc;;"; + wire [1023:0] _TECHMAP_DO_01_ = "CONSTMAP; opt_muxtree; opt_expr -mux_undef -mux_bool -fine;;;"; + + integer i; + reg [WIDTH-1:0] buffer; + reg overflow; + + always @* begin + overflow = 0; + buffer = {WIDTH{extbit}}; + buffer[`MAX(A_WIDTH, Y_WIDTH)-1:0] = A; + + if (B_WIDTH > BB_WIDTH) begin + if (B_SIGNED) begin + for (i = BB_WIDTH; i < B_WIDTH; i = i+1) + if (B[i] != B[BB_WIDTH-1]) + overflow = 1; + end else + overflow = |B[B_WIDTH-1:BB_WIDTH]; + if (overflow) + buffer = {WIDTH{extbit}}; + end + + for (i = BB_WIDTH-1; i >= 0; i = i-1) + if (B[i]) begin + if (B_SIGNED && i == BB_WIDTH-1) + buffer = {buffer, {2**i{extbit}}}; + else if (2**i < WIDTH) + buffer = {{2**i{extbit}}, buffer[WIDTH-1 : 2**i]}; + else + buffer = {WIDTH{extbit}}; + end + end + + assign Y = buffer; +endmodule + + +// -------------------------------------------------------- +// Arithmetic operators +// -------------------------------------------------------- + +(* techmap_celltype = "$fa" *) +module _90_fa (A, B, C, X, Y); + parameter WIDTH = 1; + + input [WIDTH-1:0] A, B, C; + output [WIDTH-1:0] X, Y; + + wire [WIDTH-1:0] t1, t2, t3; + + assign t1 = A ^ B, t2 = A & B, t3 = C & t1; + assign Y = t1 ^ C, X = t2 | t3; +endmodule + +(* techmap_celltype = "$lcu" *) +module _90_lcu (P, G, CI, CO); + parameter WIDTH = 2; + + input [WIDTH-1:0] P, G; + input CI; + + output [WIDTH-1:0] CO; + + integer i, j; + reg [WIDTH-1:0] p, g; + + wire [1023:0] _TECHMAP_DO_ = "proc; opt -fast"; + + always @* begin + p = P; + g = G; + + // in almost all cases CI will be constant zero + g[0] = g[0] | (p[0] & CI); + + // [[CITE]] Brent Kung Adder + // R. P. Brent and H. T. Kung, "A Regular Layout for Parallel Adders", + // IEEE Transaction on Computers, Vol. C-31, No. 3, p. 260-264, March, 1982 + + // Main tree + for (i = 1; i <= $clog2(WIDTH); i = i+1) begin + for (j = 2**i - 1; j < WIDTH; j = j + 2**i) begin + g[j] = g[j] | p[j] & g[j - 2**(i-1)]; + p[j] = p[j] & p[j - 2**(i-1)]; + end + end + + // Inverse tree + for (i = $clog2(WIDTH); i > 0; i = i-1) begin + for (j = 2**i + 2**(i-1) - 1; j < WIDTH; j = j + 2**i) begin + g[j] = g[j] | p[j] & g[j - 2**(i-1)]; + p[j] = p[j] & p[j - 2**(i-1)]; + end + end + end + + assign CO = g; +endmodule + +(* techmap_celltype = "$alu" *) +module _90_alu (A, B, CI, BI, X, Y, CO); + parameter A_SIGNED = 0; + parameter B_SIGNED = 0; + parameter A_WIDTH = 1; + parameter B_WIDTH = 1; + parameter Y_WIDTH = 1; + + input [A_WIDTH-1:0] A; + input [B_WIDTH-1:0] B; + output [Y_WIDTH-1:0] X, Y; + + input CI, BI; + output [Y_WIDTH-1:0] CO; + + wire [Y_WIDTH-1:0] A_buf, B_buf; + \$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf)); + \$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf)); + + wire [Y_WIDTH-1:0] AA = A_buf; + wire [Y_WIDTH-1:0] BB = BI ? ~B_buf : B_buf; + + \$lcu #(.WIDTH(Y_WIDTH)) lcu (.P(X), .G(AA & BB), .CI(CI), .CO(CO)); + + assign X = AA ^ BB; + assign Y = X ^ {CO, CI}; +endmodule + +(* techmap_maccmap *) +(* techmap_celltype = "$macc" *) +module _90_macc; +endmodule + +(* techmap_wrap = "alumacc" *) +(* techmap_celltype = "$lt $le $ge $gt $add $sub $neg $mul" *) +module _90_alumacc; +endmodule + + +// -------------------------------------------------------- +// Divide and Modulo +// -------------------------------------------------------- + +module \$__div_mod_u (A, B, Y, R); + parameter WIDTH = 1; + + input [WIDTH-1:0] A, B; + output [WIDTH-1:0] Y, R; + + wire [WIDTH*WIDTH-1:0] chaindata; + assign R = chaindata[WIDTH*WIDTH-1:WIDTH*(WIDTH-1)]; + + genvar i; + generate begin + for (i = 0; i < WIDTH; i=i+1) begin:stage + wire [WIDTH-1:0] stage_in; + + if (i == 0) begin:cp + assign stage_in = A; + end else begin:cp + assign stage_in = chaindata[i*WIDTH-1:(i-1)*WIDTH]; + end + + assign Y[WIDTH-(i+1)] = stage_in >= {B, {WIDTH-(i+1){1'b0}}}; + assign chaindata[(i+1)*WIDTH-1:i*WIDTH] = Y[WIDTH-(i+1)] ? stage_in - {B, {WIDTH-(i+1){1'b0}}} : stage_in; + end + end endgenerate +endmodule + +module \$__div_mod (A, B, Y, R); + parameter A_SIGNED = 0; + parameter B_SIGNED = 0; + parameter A_WIDTH = 1; + parameter B_WIDTH = 1; + parameter Y_WIDTH = 1; + + localparam WIDTH = + A_WIDTH >= B_WIDTH && A_WIDTH >= Y_WIDTH ? A_WIDTH : + B_WIDTH >= A_WIDTH && B_WIDTH >= Y_WIDTH ? B_WIDTH : Y_WIDTH; + + input [A_WIDTH-1:0] A; + input [B_WIDTH-1:0] B; + output [Y_WIDTH-1:0] Y, R; + + wire [WIDTH-1:0] A_buf, B_buf; + \$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(WIDTH)) A_conv (.A(A), .Y(A_buf)); + \$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(WIDTH)) B_conv (.A(B), .Y(B_buf)); + + wire [WIDTH-1:0] A_buf_u, B_buf_u, Y_u, R_u; + assign A_buf_u = A_SIGNED && A_buf[WIDTH-1] ? -A_buf : A_buf; + assign B_buf_u = B_SIGNED && B_buf[WIDTH-1] ? -B_buf : B_buf; + + \$__div_mod_u #( + .WIDTH(WIDTH) + ) div_mod_u ( + .A(A_buf_u), + .B(B_buf_u), + .Y(Y_u), + .R(R_u) + ); + + assign Y = A_SIGNED && B_SIGNED && (A_buf[WIDTH-1] != B_buf[WIDTH-1]) ? -Y_u : Y_u; + assign R = A_SIGNED && B_SIGNED && A_buf[WIDTH-1] ? -R_u : R_u; +endmodule + +(* techmap_celltype = "$div" *) +module _90_div (A, B, Y); + parameter A_SIGNED = 0; + parameter B_SIGNED = 0; + parameter A_WIDTH = 1; + parameter B_WIDTH = 1; + parameter Y_WIDTH = 1; + + input [A_WIDTH-1:0] A; + input [B_WIDTH-1:0] B; + output [Y_WIDTH-1:0] Y; + + \$__div_mod #( + .A_SIGNED(A_SIGNED), + .B_SIGNED(B_SIGNED), + .A_WIDTH(A_WIDTH), + .B_WIDTH(B_WIDTH), + .Y_WIDTH(Y_WIDTH) + ) div_mod ( + .A(A), + .B(B), + .Y(Y) + ); +endmodule + +(* techmap_celltype = "$mod" *) +module _90_mod (A, B, Y); + parameter A_SIGNED = 0; + parameter B_SIGNED = 0; + parameter A_WIDTH = 1; + parameter B_WIDTH = 1; + parameter Y_WIDTH = 1; + + input [A_WIDTH-1:0] A; + input [B_WIDTH-1:0] B; + output [Y_WIDTH-1:0] Y; + + \$__div_mod #( + .A_SIGNED(A_SIGNED), + .B_SIGNED(B_SIGNED), + .A_WIDTH(A_WIDTH), + .B_WIDTH(B_WIDTH), + .Y_WIDTH(Y_WIDTH) + ) div_mod ( + .A(A), + .B(B), + .R(Y) + ); +endmodule + + +// -------------------------------------------------------- +// Power +// -------------------------------------------------------- + +(* techmap_celltype = "$pow" *) +module _90_pow (A, B, Y); + parameter A_SIGNED = 0; + parameter B_SIGNED = 0; + parameter A_WIDTH = 1; + parameter B_WIDTH = 1; + parameter Y_WIDTH = 1; + + input [A_WIDTH-1:0] A; + input [B_WIDTH-1:0] B; + output [Y_WIDTH-1:0] Y; + + wire _TECHMAP_FAIL_ = 1; +endmodule + + +// -------------------------------------------------------- +// Parallel Multiplexers +// -------------------------------------------------------- + +(* techmap_celltype = "$pmux" *) +module _90_pmux (A, B, S, Y); + parameter WIDTH = 1; + parameter S_WIDTH = 1; + + input [WIDTH-1:0] A; + input [WIDTH*S_WIDTH-1:0] B; + input [S_WIDTH-1:0] S; + output [WIDTH-1:0] Y; + + wire [WIDTH-1:0] Y_B; + + genvar i, j; + generate + wire [WIDTH*S_WIDTH-1:0] B_AND_S; + for (i = 0; i < S_WIDTH; i = i + 1) begin:B_AND + assign B_AND_S[WIDTH*(i+1)-1:WIDTH*i] = B[WIDTH*(i+1)-1:WIDTH*i] & {WIDTH{S[i]}}; + end:B_AND + for (i = 0; i < WIDTH; i = i + 1) begin:B_OR + wire [S_WIDTH-1:0] B_AND_BITS; + for (j = 0; j < S_WIDTH; j = j + 1) begin:B_AND_BITS_COLLECT + assign B_AND_BITS[j] = B_AND_S[WIDTH*j+i]; + end:B_AND_BITS_COLLECT + assign Y_B[i] = |B_AND_BITS; + end:B_OR + endgenerate + + assign Y = |S ? Y_B : A; +endmodule + + +// -------------------------------------------------------- +// LUTs +// -------------------------------------------------------- + +`ifndef NOLUT +(* techmap_simplemap *) +(* techmap_celltype = "$lut $sop" *) +module _90_lut; +endmodule +`endif + diff --git a/verilog/windows/autoyosys/share/xilinx/arith_map.v b/verilog/windows/autoyosys/share/xilinx/arith_map.v new file mode 100644 index 0000000..0371965 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/arith_map.v @@ -0,0 +1,91 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +(* techmap_celltype = "$lcu" *) +module _80_xilinx_lcu (P, G, CI, CO); + parameter WIDTH = 2; + + input [WIDTH-1:0] P, G; + input CI; + + output [WIDTH-1:0] CO; + + wire _TECHMAP_FAIL_ = WIDTH <= 2; + + wire [WIDTH-1:0] C = {CO, CI}; + wire [WIDTH-1:0] S = P & ~G; + + genvar i; + generate for (i = 0; i < WIDTH; i = i + 1) begin:slice + MUXCY muxcy ( + .CI(C[i]), + .DI(G[i]), + .S(S[i]), + .O(CO[i]) + ); + end endgenerate +endmodule + +(* techmap_celltype = "$alu" *) +module _80_xilinx_alu (A, B, CI, BI, X, Y, CO); + parameter A_SIGNED = 0; + parameter B_SIGNED = 0; + parameter A_WIDTH = 1; + parameter B_WIDTH = 1; + parameter Y_WIDTH = 1; + + input [A_WIDTH-1:0] A; + input [B_WIDTH-1:0] B; + output [Y_WIDTH-1:0] X, Y; + + input CI, BI; + output [Y_WIDTH-1:0] CO; + + wire _TECHMAP_FAIL_ = Y_WIDTH <= 2; + + wire [Y_WIDTH-1:0] A_buf, B_buf; + \$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(A_buf)); + \$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(B_buf)); + + wire [Y_WIDTH-1:0] AA = A_buf; + wire [Y_WIDTH-1:0] BB = BI ? ~B_buf : B_buf; + + wire [Y_WIDTH-1:0] P = AA ^ BB; + wire [Y_WIDTH-1:0] G = AA & BB; + wire [Y_WIDTH-1:0] C = {CO, CI}; + wire [Y_WIDTH-1:0] S = P & ~G; + + genvar i; + generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice + MUXCY muxcy ( + .CI(C[i]), + .DI(G[i]), + .S(S[i]), + .O(CO[i]) + ); + XORCY xorcy ( + .CI(C[i]), + .LI(S[i]), + .O(Y[i]) + ); + end endgenerate + + assign X = P; +endmodule + diff --git a/verilog/windows/autoyosys/share/xilinx/brams.txt b/verilog/windows/autoyosys/share/xilinx/brams.txt new file mode 100644 index 0000000..f116111 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/brams.txt @@ -0,0 +1,105 @@ + +bram $__XILINX_RAMB36_SDP + init 1 + abits 9 + dbits 72 + groups 2 + ports 1 1 + wrmode 0 1 + enable 1 8 + transp 0 0 + clocks 2 3 + clkpol 2 3 +endbram + +bram $__XILINX_RAMB18_SDP + init 1 + abits 9 + dbits 36 + groups 2 + ports 1 1 + wrmode 0 1 + enable 1 4 + transp 0 0 + clocks 2 3 + clkpol 2 3 +endbram + +bram $__XILINX_RAMB36_TDP + init 1 + abits 10 @a10d36 + dbits 36 @a10d36 + abits 11 @a11d18 + dbits 18 @a11d18 + abits 12 @a12d9 + dbits 9 @a12d9 + abits 13 @a13d4 + dbits 4 @a13d4 + abits 14 @a14d2 + dbits 2 @a14d2 + abits 15 @a15d1 + dbits 1 @a15d1 + groups 2 + ports 1 1 + wrmode 0 1 + enable 1 4 @a10d36 + enable 1 2 @a11d18 + enable 1 1 @a12d9 @a13d4 @a14d2 @a15d1 + transp 0 0 + clocks 2 3 + clkpol 2 3 +endbram + +bram $__XILINX_RAMB18_TDP + init 1 + abits 10 @a10d18 + dbits 18 @a10d18 + abits 11 @a11d9 + dbits 9 @a11d9 + abits 12 @a12d4 + dbits 4 @a12d4 + abits 13 @a13d2 + dbits 2 @a13d2 + abits 14 @a14d1 + dbits 1 @a14d1 + groups 2 + ports 1 1 + wrmode 0 1 + enable 1 2 @a10d18 + enable 1 1 @a11d9 @a12d4 @a13d2 @a14d1 + transp 0 0 + clocks 2 3 + clkpol 2 3 +endbram + +match $__XILINX_RAMB36_SDP + min bits 4096 + min efficiency 5 + shuffle_enable B + make_transp + or_next_if_better +endmatch + +match $__XILINX_RAMB18_SDP + min bits 4096 + min efficiency 5 + shuffle_enable B + make_transp + or_next_if_better +endmatch + +match $__XILINX_RAMB36_TDP + min bits 4096 + min efficiency 5 + shuffle_enable B + make_transp + or_next_if_better +endmatch + +match $__XILINX_RAMB18_TDP + min bits 4096 + min efficiency 5 + shuffle_enable B + make_transp +endmatch + diff --git a/verilog/windows/autoyosys/share/xilinx/brams_bb.v b/verilog/windows/autoyosys/share/xilinx/brams_bb.v new file mode 100644 index 0000000..a682ba4 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/brams_bb.v @@ -0,0 +1,319 @@ +module RAMB18E1 ( + input CLKARDCLK, + input CLKBWRCLK, + input ENARDEN, + input ENBWREN, + input REGCEAREGCE, + input REGCEB, + input RSTRAMARSTRAM, + input RSTRAMB, + input RSTREGARSTREG, + input RSTREGB, + + input [13:0] ADDRARDADDR, + input [13:0] ADDRBWRADDR, + input [15:0] DIADI, + input [15:0] DIBDI, + input [1:0] DIPADIP, + input [1:0] DIPBDIP, + input [1:0] WEA, + input [3:0] WEBWE, + + output [15:0] DOADO, + output [15:0] DOBDO, + output [1:0] DOPADOP, + output [1:0] DOPBDOP +); + parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + + parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + + parameter IS_CLKARDCLK_INVERTED = 1'b0; + parameter IS_CLKBWRCLK_INVERTED = 1'b0; + parameter IS_ENARDEN_INVERTED = 1'b0; + parameter IS_ENBWREN_INVERTED = 1'b0; + parameter IS_RSTRAMARSTRAM_INVERTED = 1'b0; + parameter IS_RSTRAMB_INVERTED = 1'b0; + parameter IS_RSTREGARSTREG_INVERTED = 1'b0; + parameter IS_RSTREGB_INVERTED = 1'b0; + + parameter RAM_MODE = "TDP"; + parameter integer DOA_REG = 0; + parameter integer DOB_REG = 0; + + parameter integer READ_WIDTH_A = 0; + parameter integer READ_WIDTH_B = 0; + parameter integer WRITE_WIDTH_A = 0; + parameter integer WRITE_WIDTH_B = 0; + + parameter WRITE_MODE_A = "WRITE_FIRST"; + parameter WRITE_MODE_B = "WRITE_FIRST"; + + parameter SIM_DEVICE = "VIRTEX6"; +endmodule + +module RAMB36E1 ( + input CLKARDCLK, + input CLKBWRCLK, + input ENARDEN, + input ENBWREN, + input REGCEAREGCE, + input REGCEB, + input RSTRAMARSTRAM, + input RSTRAMB, + input RSTREGARSTREG, + input RSTREGB, + + input [15:0] ADDRARDADDR, + input [15:0] ADDRBWRADDR, + input [31:0] DIADI, + input [31:0] DIBDI, + input [3:0] DIPADIP, + input [3:0] DIPBDIP, + input [3:0] WEA, + input [7:0] WEBWE, + + output [31:0] DOADO, + output [31:0] DOBDO, + output [3:0] DOPADOP, + output [3:0] DOPBDOP +); + parameter INITP_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INITP_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + + parameter INIT_00 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_01 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_02 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_03 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_04 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_05 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_06 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_07 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_08 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_09 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_0F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_10 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_11 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_12 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_13 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_14 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_15 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_16 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_17 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_18 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_19 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_1F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_20 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_21 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_22 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_23 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_24 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_25 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_26 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_27 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_28 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_29 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_2F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_30 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_31 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_32 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_33 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_34 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_35 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_36 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_37 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_38 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_39 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_3F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_40 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_41 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_42 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_43 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_44 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_45 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_46 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_47 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_48 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_49 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_4F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_50 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_51 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_52 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_53 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_54 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_55 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_56 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_57 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_58 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_59 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_5F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_60 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_61 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_62 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_63 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_64 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_65 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_66 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_67 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_68 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_69 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_6F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_70 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_71 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_72 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_73 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_74 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_75 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_76 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_77 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_78 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_79 = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7A = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7B = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7C = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7D = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7E = 256'h0000000000000000000000000000000000000000000000000000000000000000; + parameter INIT_7F = 256'h0000000000000000000000000000000000000000000000000000000000000000; + + parameter IS_CLKARDCLK_INVERTED = 1'b0; + parameter IS_CLKBWRCLK_INVERTED = 1'b0; + parameter IS_ENARDEN_INVERTED = 1'b0; + parameter IS_ENBWREN_INVERTED = 1'b0; + parameter IS_RSTRAMARSTRAM_INVERTED = 1'b0; + parameter IS_RSTRAMB_INVERTED = 1'b0; + parameter IS_RSTREGARSTREG_INVERTED = 1'b0; + parameter IS_RSTREGB_INVERTED = 1'b0; + + parameter RAM_MODE = "TDP"; + parameter integer DOA_REG = 0; + parameter integer DOB_REG = 0; + + parameter integer READ_WIDTH_A = 0; + parameter integer READ_WIDTH_B = 0; + parameter integer WRITE_WIDTH_A = 0; + parameter integer WRITE_WIDTH_B = 0; + + parameter WRITE_MODE_A = "WRITE_FIRST"; + parameter WRITE_MODE_B = "WRITE_FIRST"; + + parameter SIM_DEVICE = "VIRTEX6"; +endmodule diff --git a/verilog/windows/autoyosys/share/xilinx/brams_init_16.vh b/verilog/windows/autoyosys/share/xilinx/brams_init_16.vh new file mode 100644 index 0000000..783a064 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/brams_init_16.vh @@ -0,0 +1,64 @@ +.INIT_00(INIT[ 0*256 +: 256]), +.INIT_01(INIT[ 1*256 +: 256]), +.INIT_02(INIT[ 2*256 +: 256]), +.INIT_03(INIT[ 3*256 +: 256]), +.INIT_04(INIT[ 4*256 +: 256]), +.INIT_05(INIT[ 5*256 +: 256]), +.INIT_06(INIT[ 6*256 +: 256]), +.INIT_07(INIT[ 7*256 +: 256]), +.INIT_08(INIT[ 8*256 +: 256]), +.INIT_09(INIT[ 9*256 +: 256]), +.INIT_0A(INIT[ 10*256 +: 256]), +.INIT_0B(INIT[ 11*256 +: 256]), +.INIT_0C(INIT[ 12*256 +: 256]), +.INIT_0D(INIT[ 13*256 +: 256]), +.INIT_0E(INIT[ 14*256 +: 256]), +.INIT_0F(INIT[ 15*256 +: 256]), +.INIT_10(INIT[ 16*256 +: 256]), +.INIT_11(INIT[ 17*256 +: 256]), +.INIT_12(INIT[ 18*256 +: 256]), +.INIT_13(INIT[ 19*256 +: 256]), +.INIT_14(INIT[ 20*256 +: 256]), +.INIT_15(INIT[ 21*256 +: 256]), +.INIT_16(INIT[ 22*256 +: 256]), +.INIT_17(INIT[ 23*256 +: 256]), +.INIT_18(INIT[ 24*256 +: 256]), +.INIT_19(INIT[ 25*256 +: 256]), +.INIT_1A(INIT[ 26*256 +: 256]), +.INIT_1B(INIT[ 27*256 +: 256]), +.INIT_1C(INIT[ 28*256 +: 256]), +.INIT_1D(INIT[ 29*256 +: 256]), +.INIT_1E(INIT[ 30*256 +: 256]), +.INIT_1F(INIT[ 31*256 +: 256]), +.INIT_20(INIT[ 32*256 +: 256]), +.INIT_21(INIT[ 33*256 +: 256]), +.INIT_22(INIT[ 34*256 +: 256]), +.INIT_23(INIT[ 35*256 +: 256]), +.INIT_24(INIT[ 36*256 +: 256]), +.INIT_25(INIT[ 37*256 +: 256]), +.INIT_26(INIT[ 38*256 +: 256]), +.INIT_27(INIT[ 39*256 +: 256]), +.INIT_28(INIT[ 40*256 +: 256]), +.INIT_29(INIT[ 41*256 +: 256]), +.INIT_2A(INIT[ 42*256 +: 256]), +.INIT_2B(INIT[ 43*256 +: 256]), +.INIT_2C(INIT[ 44*256 +: 256]), +.INIT_2D(INIT[ 45*256 +: 256]), +.INIT_2E(INIT[ 46*256 +: 256]), +.INIT_2F(INIT[ 47*256 +: 256]), +.INIT_30(INIT[ 48*256 +: 256]), +.INIT_31(INIT[ 49*256 +: 256]), +.INIT_32(INIT[ 50*256 +: 256]), +.INIT_33(INIT[ 51*256 +: 256]), +.INIT_34(INIT[ 52*256 +: 256]), +.INIT_35(INIT[ 53*256 +: 256]), +.INIT_36(INIT[ 54*256 +: 256]), +.INIT_37(INIT[ 55*256 +: 256]), +.INIT_38(INIT[ 56*256 +: 256]), +.INIT_39(INIT[ 57*256 +: 256]), +.INIT_3A(INIT[ 58*256 +: 256]), +.INIT_3B(INIT[ 59*256 +: 256]), +.INIT_3C(INIT[ 60*256 +: 256]), +.INIT_3D(INIT[ 61*256 +: 256]), +.INIT_3E(INIT[ 62*256 +: 256]), +.INIT_3F(INIT[ 63*256 +: 256]), diff --git a/verilog/windows/autoyosys/share/xilinx/brams_init_18.vh b/verilog/windows/autoyosys/share/xilinx/brams_init_18.vh new file mode 100644 index 0000000..efd537b --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/brams_init_18.vh @@ -0,0 +1,1024 @@ +.INITP_00({INIT[255*9+8], INIT[254*9+8], INIT[253*9+8], INIT[252*9+8], + INIT[251*9+8], INIT[250*9+8], INIT[249*9+8], INIT[248*9+8], + INIT[247*9+8], INIT[246*9+8], INIT[245*9+8], INIT[244*9+8], + INIT[243*9+8], INIT[242*9+8], INIT[241*9+8], INIT[240*9+8], + INIT[239*9+8], INIT[238*9+8], INIT[237*9+8], INIT[236*9+8], + INIT[235*9+8], INIT[234*9+8], INIT[233*9+8], INIT[232*9+8], + INIT[231*9+8], INIT[230*9+8], INIT[229*9+8], INIT[228*9+8], + INIT[227*9+8], INIT[226*9+8], INIT[225*9+8], INIT[224*9+8], + INIT[223*9+8], INIT[222*9+8], INIT[221*9+8], INIT[220*9+8], + INIT[219*9+8], INIT[218*9+8], INIT[217*9+8], INIT[216*9+8], + INIT[215*9+8], INIT[214*9+8], INIT[213*9+8], INIT[212*9+8], + INIT[211*9+8], INIT[210*9+8], INIT[209*9+8], INIT[208*9+8], + INIT[207*9+8], INIT[206*9+8], INIT[205*9+8], INIT[204*9+8], + INIT[203*9+8], INIT[202*9+8], INIT[201*9+8], INIT[200*9+8], + INIT[199*9+8], INIT[198*9+8], INIT[197*9+8], INIT[196*9+8], + INIT[195*9+8], INIT[194*9+8], INIT[193*9+8], INIT[192*9+8], + INIT[191*9+8], INIT[190*9+8], INIT[189*9+8], INIT[188*9+8], + INIT[187*9+8], INIT[186*9+8], INIT[185*9+8], INIT[184*9+8], + INIT[183*9+8], INIT[182*9+8], INIT[181*9+8], INIT[180*9+8], + INIT[179*9+8], INIT[178*9+8], INIT[177*9+8], INIT[176*9+8], + INIT[175*9+8], INIT[174*9+8], INIT[173*9+8], INIT[172*9+8], + INIT[171*9+8], INIT[170*9+8], INIT[169*9+8], INIT[168*9+8], + INIT[167*9+8], INIT[166*9+8], INIT[165*9+8], INIT[164*9+8], + INIT[163*9+8], INIT[162*9+8], INIT[161*9+8], INIT[160*9+8], + INIT[159*9+8], INIT[158*9+8], INIT[157*9+8], INIT[156*9+8], + INIT[155*9+8], INIT[154*9+8], INIT[153*9+8], INIT[152*9+8], + INIT[151*9+8], INIT[150*9+8], INIT[149*9+8], INIT[148*9+8], + INIT[147*9+8], INIT[146*9+8], INIT[145*9+8], INIT[144*9+8], + INIT[143*9+8], INIT[142*9+8], INIT[141*9+8], INIT[140*9+8], + INIT[139*9+8], INIT[138*9+8], INIT[137*9+8], INIT[136*9+8], + INIT[135*9+8], INIT[134*9+8], INIT[133*9+8], INIT[132*9+8], + INIT[131*9+8], INIT[130*9+8], INIT[129*9+8], INIT[128*9+8], + INIT[127*9+8], INIT[126*9+8], INIT[125*9+8], INIT[124*9+8], + INIT[123*9+8], INIT[122*9+8], INIT[121*9+8], INIT[120*9+8], + INIT[119*9+8], INIT[118*9+8], INIT[117*9+8], INIT[116*9+8], + INIT[115*9+8], INIT[114*9+8], INIT[113*9+8], INIT[112*9+8], + INIT[111*9+8], INIT[110*9+8], INIT[109*9+8], INIT[108*9+8], + INIT[107*9+8], INIT[106*9+8], INIT[105*9+8], INIT[104*9+8], + INIT[103*9+8], INIT[102*9+8], INIT[101*9+8], INIT[100*9+8], + INIT[ 99*9+8], INIT[ 98*9+8], INIT[ 97*9+8], INIT[ 96*9+8], + INIT[ 95*9+8], INIT[ 94*9+8], INIT[ 93*9+8], INIT[ 92*9+8], + INIT[ 91*9+8], INIT[ 90*9+8], INIT[ 89*9+8], INIT[ 88*9+8], + INIT[ 87*9+8], INIT[ 86*9+8], INIT[ 85*9+8], INIT[ 84*9+8], + INIT[ 83*9+8], INIT[ 82*9+8], INIT[ 81*9+8], INIT[ 80*9+8], + INIT[ 79*9+8], INIT[ 78*9+8], INIT[ 77*9+8], INIT[ 76*9+8], + INIT[ 75*9+8], INIT[ 74*9+8], INIT[ 73*9+8], INIT[ 72*9+8], + INIT[ 71*9+8], INIT[ 70*9+8], INIT[ 69*9+8], INIT[ 68*9+8], + INIT[ 67*9+8], INIT[ 66*9+8], INIT[ 65*9+8], INIT[ 64*9+8], + INIT[ 63*9+8], INIT[ 62*9+8], INIT[ 61*9+8], INIT[ 60*9+8], + INIT[ 59*9+8], INIT[ 58*9+8], INIT[ 57*9+8], INIT[ 56*9+8], + INIT[ 55*9+8], INIT[ 54*9+8], INIT[ 53*9+8], INIT[ 52*9+8], + INIT[ 51*9+8], INIT[ 50*9+8], INIT[ 49*9+8], INIT[ 48*9+8], + INIT[ 47*9+8], INIT[ 46*9+8], INIT[ 45*9+8], INIT[ 44*9+8], + INIT[ 43*9+8], INIT[ 42*9+8], INIT[ 41*9+8], INIT[ 40*9+8], + INIT[ 39*9+8], INIT[ 38*9+8], INIT[ 37*9+8], INIT[ 36*9+8], + INIT[ 35*9+8], INIT[ 34*9+8], INIT[ 33*9+8], INIT[ 32*9+8], + INIT[ 31*9+8], INIT[ 30*9+8], INIT[ 29*9+8], INIT[ 28*9+8], + INIT[ 27*9+8], INIT[ 26*9+8], INIT[ 25*9+8], INIT[ 24*9+8], + INIT[ 23*9+8], INIT[ 22*9+8], INIT[ 21*9+8], INIT[ 20*9+8], + INIT[ 19*9+8], INIT[ 18*9+8], INIT[ 17*9+8], INIT[ 16*9+8], + INIT[ 15*9+8], INIT[ 14*9+8], INIT[ 13*9+8], INIT[ 12*9+8], + INIT[ 11*9+8], INIT[ 10*9+8], INIT[ 9*9+8], INIT[ 8*9+8], + INIT[ 7*9+8], INIT[ 6*9+8], INIT[ 5*9+8], INIT[ 4*9+8], + INIT[ 3*9+8], INIT[ 2*9+8], INIT[ 1*9+8], INIT[ 0*9+8]}), +.INITP_01({INIT[511*9+8], INIT[510*9+8], INIT[509*9+8], INIT[508*9+8], + INIT[507*9+8], INIT[506*9+8], INIT[505*9+8], INIT[504*9+8], + INIT[503*9+8], INIT[502*9+8], INIT[501*9+8], INIT[500*9+8], + INIT[499*9+8], INIT[498*9+8], INIT[497*9+8], INIT[496*9+8], + INIT[495*9+8], INIT[494*9+8], INIT[493*9+8], INIT[492*9+8], + INIT[491*9+8], INIT[490*9+8], INIT[489*9+8], INIT[488*9+8], + INIT[487*9+8], INIT[486*9+8], INIT[485*9+8], INIT[484*9+8], + INIT[483*9+8], INIT[482*9+8], INIT[481*9+8], INIT[480*9+8], + INIT[479*9+8], INIT[478*9+8], INIT[477*9+8], INIT[476*9+8], + INIT[475*9+8], INIT[474*9+8], INIT[473*9+8], INIT[472*9+8], + INIT[471*9+8], INIT[470*9+8], INIT[469*9+8], INIT[468*9+8], + INIT[467*9+8], INIT[466*9+8], INIT[465*9+8], INIT[464*9+8], + INIT[463*9+8], INIT[462*9+8], INIT[461*9+8], INIT[460*9+8], + INIT[459*9+8], INIT[458*9+8], INIT[457*9+8], INIT[456*9+8], + INIT[455*9+8], INIT[454*9+8], INIT[453*9+8], INIT[452*9+8], + INIT[451*9+8], INIT[450*9+8], INIT[449*9+8], INIT[448*9+8], + INIT[447*9+8], INIT[446*9+8], INIT[445*9+8], INIT[444*9+8], + INIT[443*9+8], INIT[442*9+8], INIT[441*9+8], INIT[440*9+8], + INIT[439*9+8], INIT[438*9+8], INIT[437*9+8], INIT[436*9+8], + INIT[435*9+8], INIT[434*9+8], INIT[433*9+8], INIT[432*9+8], + INIT[431*9+8], INIT[430*9+8], INIT[429*9+8], INIT[428*9+8], + INIT[427*9+8], INIT[426*9+8], INIT[425*9+8], INIT[424*9+8], + INIT[423*9+8], INIT[422*9+8], INIT[421*9+8], INIT[420*9+8], + INIT[419*9+8], INIT[418*9+8], INIT[417*9+8], INIT[416*9+8], + INIT[415*9+8], INIT[414*9+8], INIT[413*9+8], INIT[412*9+8], + INIT[411*9+8], INIT[410*9+8], INIT[409*9+8], INIT[408*9+8], + INIT[407*9+8], INIT[406*9+8], INIT[405*9+8], INIT[404*9+8], + INIT[403*9+8], INIT[402*9+8], INIT[401*9+8], INIT[400*9+8], + INIT[399*9+8], INIT[398*9+8], INIT[397*9+8], INIT[396*9+8], + INIT[395*9+8], INIT[394*9+8], INIT[393*9+8], INIT[392*9+8], + INIT[391*9+8], INIT[390*9+8], INIT[389*9+8], INIT[388*9+8], + INIT[387*9+8], INIT[386*9+8], INIT[385*9+8], INIT[384*9+8], + INIT[383*9+8], INIT[382*9+8], INIT[381*9+8], INIT[380*9+8], + INIT[379*9+8], INIT[378*9+8], INIT[377*9+8], INIT[376*9+8], + INIT[375*9+8], INIT[374*9+8], INIT[373*9+8], INIT[372*9+8], + INIT[371*9+8], INIT[370*9+8], INIT[369*9+8], INIT[368*9+8], + INIT[367*9+8], INIT[366*9+8], INIT[365*9+8], INIT[364*9+8], + INIT[363*9+8], INIT[362*9+8], INIT[361*9+8], INIT[360*9+8], + INIT[359*9+8], INIT[358*9+8], INIT[357*9+8], INIT[356*9+8], + INIT[355*9+8], INIT[354*9+8], INIT[353*9+8], INIT[352*9+8], + INIT[351*9+8], INIT[350*9+8], INIT[349*9+8], INIT[348*9+8], + INIT[347*9+8], INIT[346*9+8], INIT[345*9+8], INIT[344*9+8], + INIT[343*9+8], INIT[342*9+8], INIT[341*9+8], INIT[340*9+8], + INIT[339*9+8], INIT[338*9+8], INIT[337*9+8], INIT[336*9+8], + INIT[335*9+8], INIT[334*9+8], INIT[333*9+8], INIT[332*9+8], + INIT[331*9+8], INIT[330*9+8], INIT[329*9+8], INIT[328*9+8], + INIT[327*9+8], INIT[326*9+8], INIT[325*9+8], INIT[324*9+8], + INIT[323*9+8], INIT[322*9+8], INIT[321*9+8], INIT[320*9+8], + INIT[319*9+8], INIT[318*9+8], INIT[317*9+8], INIT[316*9+8], + INIT[315*9+8], INIT[314*9+8], INIT[313*9+8], INIT[312*9+8], + INIT[311*9+8], INIT[310*9+8], INIT[309*9+8], INIT[308*9+8], + INIT[307*9+8], INIT[306*9+8], INIT[305*9+8], INIT[304*9+8], + INIT[303*9+8], INIT[302*9+8], INIT[301*9+8], INIT[300*9+8], + INIT[299*9+8], INIT[298*9+8], INIT[297*9+8], INIT[296*9+8], + INIT[295*9+8], INIT[294*9+8], INIT[293*9+8], INIT[292*9+8], + INIT[291*9+8], INIT[290*9+8], INIT[289*9+8], INIT[288*9+8], + INIT[287*9+8], INIT[286*9+8], INIT[285*9+8], INIT[284*9+8], + INIT[283*9+8], INIT[282*9+8], INIT[281*9+8], INIT[280*9+8], + INIT[279*9+8], INIT[278*9+8], INIT[277*9+8], INIT[276*9+8], + INIT[275*9+8], INIT[274*9+8], INIT[273*9+8], INIT[272*9+8], + INIT[271*9+8], INIT[270*9+8], INIT[269*9+8], INIT[268*9+8], + INIT[267*9+8], INIT[266*9+8], INIT[265*9+8], INIT[264*9+8], + INIT[263*9+8], INIT[262*9+8], INIT[261*9+8], INIT[260*9+8], + INIT[259*9+8], INIT[258*9+8], INIT[257*9+8], INIT[256*9+8]}), +.INITP_02({INIT[767*9+8], INIT[766*9+8], INIT[765*9+8], INIT[764*9+8], + INIT[763*9+8], INIT[762*9+8], INIT[761*9+8], INIT[760*9+8], + INIT[759*9+8], INIT[758*9+8], INIT[757*9+8], INIT[756*9+8], + INIT[755*9+8], INIT[754*9+8], INIT[753*9+8], INIT[752*9+8], + INIT[751*9+8], INIT[750*9+8], INIT[749*9+8], INIT[748*9+8], + INIT[747*9+8], INIT[746*9+8], INIT[745*9+8], INIT[744*9+8], + INIT[743*9+8], INIT[742*9+8], INIT[741*9+8], INIT[740*9+8], + INIT[739*9+8], INIT[738*9+8], INIT[737*9+8], INIT[736*9+8], + INIT[735*9+8], INIT[734*9+8], INIT[733*9+8], INIT[732*9+8], + INIT[731*9+8], INIT[730*9+8], INIT[729*9+8], INIT[728*9+8], + INIT[727*9+8], INIT[726*9+8], INIT[725*9+8], INIT[724*9+8], + INIT[723*9+8], INIT[722*9+8], INIT[721*9+8], INIT[720*9+8], + INIT[719*9+8], INIT[718*9+8], INIT[717*9+8], INIT[716*9+8], + INIT[715*9+8], INIT[714*9+8], INIT[713*9+8], INIT[712*9+8], + INIT[711*9+8], INIT[710*9+8], INIT[709*9+8], INIT[708*9+8], + INIT[707*9+8], INIT[706*9+8], INIT[705*9+8], INIT[704*9+8], + INIT[703*9+8], INIT[702*9+8], INIT[701*9+8], INIT[700*9+8], + INIT[699*9+8], INIT[698*9+8], INIT[697*9+8], INIT[696*9+8], + INIT[695*9+8], INIT[694*9+8], INIT[693*9+8], INIT[692*9+8], + INIT[691*9+8], INIT[690*9+8], INIT[689*9+8], INIT[688*9+8], + INIT[687*9+8], INIT[686*9+8], INIT[685*9+8], INIT[684*9+8], + INIT[683*9+8], INIT[682*9+8], INIT[681*9+8], INIT[680*9+8], + INIT[679*9+8], INIT[678*9+8], INIT[677*9+8], INIT[676*9+8], + INIT[675*9+8], INIT[674*9+8], INIT[673*9+8], INIT[672*9+8], + INIT[671*9+8], INIT[670*9+8], INIT[669*9+8], INIT[668*9+8], + INIT[667*9+8], INIT[666*9+8], INIT[665*9+8], INIT[664*9+8], + INIT[663*9+8], INIT[662*9+8], INIT[661*9+8], INIT[660*9+8], + INIT[659*9+8], INIT[658*9+8], INIT[657*9+8], INIT[656*9+8], + INIT[655*9+8], INIT[654*9+8], INIT[653*9+8], INIT[652*9+8], + INIT[651*9+8], INIT[650*9+8], INIT[649*9+8], INIT[648*9+8], + INIT[647*9+8], INIT[646*9+8], INIT[645*9+8], INIT[644*9+8], + INIT[643*9+8], INIT[642*9+8], INIT[641*9+8], INIT[640*9+8], + INIT[639*9+8], INIT[638*9+8], INIT[637*9+8], INIT[636*9+8], + INIT[635*9+8], INIT[634*9+8], INIT[633*9+8], INIT[632*9+8], + INIT[631*9+8], INIT[630*9+8], INIT[629*9+8], INIT[628*9+8], + INIT[627*9+8], INIT[626*9+8], INIT[625*9+8], INIT[624*9+8], + INIT[623*9+8], INIT[622*9+8], INIT[621*9+8], INIT[620*9+8], + INIT[619*9+8], INIT[618*9+8], INIT[617*9+8], INIT[616*9+8], + INIT[615*9+8], INIT[614*9+8], INIT[613*9+8], INIT[612*9+8], + INIT[611*9+8], INIT[610*9+8], INIT[609*9+8], INIT[608*9+8], + INIT[607*9+8], INIT[606*9+8], INIT[605*9+8], INIT[604*9+8], + INIT[603*9+8], INIT[602*9+8], INIT[601*9+8], INIT[600*9+8], + INIT[599*9+8], INIT[598*9+8], INIT[597*9+8], INIT[596*9+8], + INIT[595*9+8], INIT[594*9+8], INIT[593*9+8], INIT[592*9+8], + INIT[591*9+8], INIT[590*9+8], INIT[589*9+8], INIT[588*9+8], + INIT[587*9+8], INIT[586*9+8], INIT[585*9+8], INIT[584*9+8], + INIT[583*9+8], INIT[582*9+8], INIT[581*9+8], INIT[580*9+8], + INIT[579*9+8], INIT[578*9+8], INIT[577*9+8], INIT[576*9+8], + INIT[575*9+8], INIT[574*9+8], INIT[573*9+8], INIT[572*9+8], + INIT[571*9+8], INIT[570*9+8], INIT[569*9+8], INIT[568*9+8], + INIT[567*9+8], INIT[566*9+8], INIT[565*9+8], INIT[564*9+8], + INIT[563*9+8], INIT[562*9+8], INIT[561*9+8], INIT[560*9+8], + INIT[559*9+8], INIT[558*9+8], INIT[557*9+8], INIT[556*9+8], + INIT[555*9+8], INIT[554*9+8], INIT[553*9+8], INIT[552*9+8], + INIT[551*9+8], INIT[550*9+8], INIT[549*9+8], INIT[548*9+8], + INIT[547*9+8], INIT[546*9+8], INIT[545*9+8], INIT[544*9+8], + INIT[543*9+8], INIT[542*9+8], INIT[541*9+8], INIT[540*9+8], + INIT[539*9+8], INIT[538*9+8], INIT[537*9+8], INIT[536*9+8], + INIT[535*9+8], INIT[534*9+8], INIT[533*9+8], INIT[532*9+8], + INIT[531*9+8], INIT[530*9+8], INIT[529*9+8], INIT[528*9+8], + INIT[527*9+8], INIT[526*9+8], INIT[525*9+8], INIT[524*9+8], + INIT[523*9+8], INIT[522*9+8], INIT[521*9+8], INIT[520*9+8], + INIT[519*9+8], INIT[518*9+8], INIT[517*9+8], INIT[516*9+8], + INIT[515*9+8], INIT[514*9+8], INIT[513*9+8], INIT[512*9+8]}), +.INITP_03({INIT[1023*9+8], INIT[1022*9+8], INIT[1021*9+8], INIT[1020*9+8], + INIT[1019*9+8], INIT[1018*9+8], INIT[1017*9+8], INIT[1016*9+8], + INIT[1015*9+8], INIT[1014*9+8], INIT[1013*9+8], INIT[1012*9+8], + INIT[1011*9+8], INIT[1010*9+8], INIT[1009*9+8], INIT[1008*9+8], + INIT[1007*9+8], INIT[1006*9+8], INIT[1005*9+8], INIT[1004*9+8], + INIT[1003*9+8], INIT[1002*9+8], INIT[1001*9+8], INIT[1000*9+8], + INIT[999*9+8], INIT[998*9+8], INIT[997*9+8], INIT[996*9+8], + INIT[995*9+8], INIT[994*9+8], INIT[993*9+8], INIT[992*9+8], + INIT[991*9+8], INIT[990*9+8], INIT[989*9+8], INIT[988*9+8], + INIT[987*9+8], INIT[986*9+8], INIT[985*9+8], INIT[984*9+8], + INIT[983*9+8], INIT[982*9+8], INIT[981*9+8], INIT[980*9+8], + INIT[979*9+8], INIT[978*9+8], INIT[977*9+8], INIT[976*9+8], + INIT[975*9+8], INIT[974*9+8], INIT[973*9+8], INIT[972*9+8], + INIT[971*9+8], INIT[970*9+8], INIT[969*9+8], INIT[968*9+8], + INIT[967*9+8], INIT[966*9+8], INIT[965*9+8], INIT[964*9+8], + INIT[963*9+8], INIT[962*9+8], INIT[961*9+8], INIT[960*9+8], + INIT[959*9+8], INIT[958*9+8], INIT[957*9+8], INIT[956*9+8], + INIT[955*9+8], INIT[954*9+8], INIT[953*9+8], INIT[952*9+8], + INIT[951*9+8], INIT[950*9+8], INIT[949*9+8], INIT[948*9+8], + INIT[947*9+8], INIT[946*9+8], INIT[945*9+8], INIT[944*9+8], + INIT[943*9+8], INIT[942*9+8], INIT[941*9+8], INIT[940*9+8], + INIT[939*9+8], INIT[938*9+8], INIT[937*9+8], INIT[936*9+8], + INIT[935*9+8], INIT[934*9+8], INIT[933*9+8], INIT[932*9+8], + INIT[931*9+8], INIT[930*9+8], INIT[929*9+8], INIT[928*9+8], + INIT[927*9+8], INIT[926*9+8], INIT[925*9+8], INIT[924*9+8], + INIT[923*9+8], INIT[922*9+8], INIT[921*9+8], INIT[920*9+8], + INIT[919*9+8], INIT[918*9+8], INIT[917*9+8], INIT[916*9+8], + INIT[915*9+8], INIT[914*9+8], INIT[913*9+8], INIT[912*9+8], + INIT[911*9+8], INIT[910*9+8], INIT[909*9+8], INIT[908*9+8], + INIT[907*9+8], INIT[906*9+8], INIT[905*9+8], INIT[904*9+8], + INIT[903*9+8], INIT[902*9+8], INIT[901*9+8], INIT[900*9+8], + INIT[899*9+8], INIT[898*9+8], INIT[897*9+8], INIT[896*9+8], + INIT[895*9+8], INIT[894*9+8], INIT[893*9+8], INIT[892*9+8], + INIT[891*9+8], INIT[890*9+8], INIT[889*9+8], INIT[888*9+8], + INIT[887*9+8], INIT[886*9+8], INIT[885*9+8], INIT[884*9+8], + INIT[883*9+8], INIT[882*9+8], INIT[881*9+8], INIT[880*9+8], + INIT[879*9+8], INIT[878*9+8], INIT[877*9+8], INIT[876*9+8], + INIT[875*9+8], INIT[874*9+8], INIT[873*9+8], INIT[872*9+8], + INIT[871*9+8], INIT[870*9+8], INIT[869*9+8], INIT[868*9+8], + INIT[867*9+8], INIT[866*9+8], INIT[865*9+8], INIT[864*9+8], + INIT[863*9+8], INIT[862*9+8], INIT[861*9+8], INIT[860*9+8], + INIT[859*9+8], INIT[858*9+8], INIT[857*9+8], INIT[856*9+8], + INIT[855*9+8], INIT[854*9+8], INIT[853*9+8], INIT[852*9+8], + INIT[851*9+8], INIT[850*9+8], INIT[849*9+8], INIT[848*9+8], + INIT[847*9+8], INIT[846*9+8], INIT[845*9+8], INIT[844*9+8], + INIT[843*9+8], INIT[842*9+8], INIT[841*9+8], INIT[840*9+8], + INIT[839*9+8], INIT[838*9+8], INIT[837*9+8], INIT[836*9+8], + INIT[835*9+8], INIT[834*9+8], INIT[833*9+8], INIT[832*9+8], + INIT[831*9+8], INIT[830*9+8], INIT[829*9+8], INIT[828*9+8], + INIT[827*9+8], INIT[826*9+8], INIT[825*9+8], INIT[824*9+8], + INIT[823*9+8], INIT[822*9+8], INIT[821*9+8], INIT[820*9+8], + INIT[819*9+8], INIT[818*9+8], INIT[817*9+8], INIT[816*9+8], + INIT[815*9+8], INIT[814*9+8], INIT[813*9+8], INIT[812*9+8], + INIT[811*9+8], INIT[810*9+8], INIT[809*9+8], INIT[808*9+8], + INIT[807*9+8], INIT[806*9+8], INIT[805*9+8], INIT[804*9+8], + INIT[803*9+8], INIT[802*9+8], INIT[801*9+8], INIT[800*9+8], + INIT[799*9+8], INIT[798*9+8], INIT[797*9+8], INIT[796*9+8], + INIT[795*9+8], INIT[794*9+8], INIT[793*9+8], INIT[792*9+8], + INIT[791*9+8], INIT[790*9+8], INIT[789*9+8], INIT[788*9+8], + INIT[787*9+8], INIT[786*9+8], INIT[785*9+8], INIT[784*9+8], + INIT[783*9+8], INIT[782*9+8], INIT[781*9+8], INIT[780*9+8], + INIT[779*9+8], INIT[778*9+8], INIT[777*9+8], INIT[776*9+8], + INIT[775*9+8], INIT[774*9+8], INIT[773*9+8], INIT[772*9+8], + INIT[771*9+8], INIT[770*9+8], INIT[769*9+8], INIT[768*9+8]}), +.INITP_04({INIT[1279*9+8], INIT[1278*9+8], INIT[1277*9+8], INIT[1276*9+8], + INIT[1275*9+8], INIT[1274*9+8], INIT[1273*9+8], INIT[1272*9+8], + INIT[1271*9+8], INIT[1270*9+8], INIT[1269*9+8], INIT[1268*9+8], + INIT[1267*9+8], INIT[1266*9+8], INIT[1265*9+8], INIT[1264*9+8], + INIT[1263*9+8], INIT[1262*9+8], INIT[1261*9+8], INIT[1260*9+8], + INIT[1259*9+8], INIT[1258*9+8], INIT[1257*9+8], INIT[1256*9+8], + INIT[1255*9+8], INIT[1254*9+8], INIT[1253*9+8], INIT[1252*9+8], + INIT[1251*9+8], INIT[1250*9+8], INIT[1249*9+8], INIT[1248*9+8], + INIT[1247*9+8], INIT[1246*9+8], INIT[1245*9+8], INIT[1244*9+8], + INIT[1243*9+8], INIT[1242*9+8], INIT[1241*9+8], INIT[1240*9+8], + INIT[1239*9+8], INIT[1238*9+8], INIT[1237*9+8], INIT[1236*9+8], + INIT[1235*9+8], INIT[1234*9+8], INIT[1233*9+8], INIT[1232*9+8], + INIT[1231*9+8], INIT[1230*9+8], INIT[1229*9+8], INIT[1228*9+8], + INIT[1227*9+8], INIT[1226*9+8], INIT[1225*9+8], INIT[1224*9+8], + INIT[1223*9+8], INIT[1222*9+8], INIT[1221*9+8], INIT[1220*9+8], + INIT[1219*9+8], INIT[1218*9+8], INIT[1217*9+8], INIT[1216*9+8], + INIT[1215*9+8], INIT[1214*9+8], INIT[1213*9+8], INIT[1212*9+8], + INIT[1211*9+8], INIT[1210*9+8], INIT[1209*9+8], INIT[1208*9+8], + INIT[1207*9+8], INIT[1206*9+8], INIT[1205*9+8], INIT[1204*9+8], + INIT[1203*9+8], INIT[1202*9+8], INIT[1201*9+8], INIT[1200*9+8], + INIT[1199*9+8], INIT[1198*9+8], INIT[1197*9+8], INIT[1196*9+8], + INIT[1195*9+8], INIT[1194*9+8], INIT[1193*9+8], INIT[1192*9+8], + INIT[1191*9+8], INIT[1190*9+8], INIT[1189*9+8], INIT[1188*9+8], + INIT[1187*9+8], INIT[1186*9+8], INIT[1185*9+8], INIT[1184*9+8], + INIT[1183*9+8], INIT[1182*9+8], INIT[1181*9+8], INIT[1180*9+8], + INIT[1179*9+8], INIT[1178*9+8], INIT[1177*9+8], INIT[1176*9+8], + INIT[1175*9+8], INIT[1174*9+8], INIT[1173*9+8], INIT[1172*9+8], + INIT[1171*9+8], INIT[1170*9+8], INIT[1169*9+8], INIT[1168*9+8], + INIT[1167*9+8], INIT[1166*9+8], INIT[1165*9+8], INIT[1164*9+8], + INIT[1163*9+8], INIT[1162*9+8], INIT[1161*9+8], INIT[1160*9+8], + INIT[1159*9+8], INIT[1158*9+8], INIT[1157*9+8], INIT[1156*9+8], + INIT[1155*9+8], INIT[1154*9+8], INIT[1153*9+8], INIT[1152*9+8], + INIT[1151*9+8], INIT[1150*9+8], INIT[1149*9+8], INIT[1148*9+8], + INIT[1147*9+8], INIT[1146*9+8], INIT[1145*9+8], INIT[1144*9+8], + INIT[1143*9+8], INIT[1142*9+8], INIT[1141*9+8], INIT[1140*9+8], + INIT[1139*9+8], INIT[1138*9+8], INIT[1137*9+8], INIT[1136*9+8], + INIT[1135*9+8], INIT[1134*9+8], INIT[1133*9+8], INIT[1132*9+8], + INIT[1131*9+8], INIT[1130*9+8], INIT[1129*9+8], INIT[1128*9+8], + INIT[1127*9+8], INIT[1126*9+8], INIT[1125*9+8], INIT[1124*9+8], + INIT[1123*9+8], INIT[1122*9+8], INIT[1121*9+8], INIT[1120*9+8], + INIT[1119*9+8], INIT[1118*9+8], INIT[1117*9+8], INIT[1116*9+8], + INIT[1115*9+8], INIT[1114*9+8], INIT[1113*9+8], INIT[1112*9+8], + INIT[1111*9+8], INIT[1110*9+8], INIT[1109*9+8], INIT[1108*9+8], + INIT[1107*9+8], INIT[1106*9+8], INIT[1105*9+8], INIT[1104*9+8], + INIT[1103*9+8], INIT[1102*9+8], INIT[1101*9+8], INIT[1100*9+8], + INIT[1099*9+8], INIT[1098*9+8], INIT[1097*9+8], INIT[1096*9+8], + INIT[1095*9+8], INIT[1094*9+8], INIT[1093*9+8], INIT[1092*9+8], + INIT[1091*9+8], INIT[1090*9+8], INIT[1089*9+8], INIT[1088*9+8], + INIT[1087*9+8], INIT[1086*9+8], INIT[1085*9+8], INIT[1084*9+8], + INIT[1083*9+8], INIT[1082*9+8], INIT[1081*9+8], INIT[1080*9+8], + INIT[1079*9+8], INIT[1078*9+8], INIT[1077*9+8], INIT[1076*9+8], + INIT[1075*9+8], INIT[1074*9+8], INIT[1073*9+8], INIT[1072*9+8], + INIT[1071*9+8], INIT[1070*9+8], INIT[1069*9+8], INIT[1068*9+8], + INIT[1067*9+8], INIT[1066*9+8], INIT[1065*9+8], INIT[1064*9+8], + INIT[1063*9+8], INIT[1062*9+8], INIT[1061*9+8], INIT[1060*9+8], + INIT[1059*9+8], INIT[1058*9+8], INIT[1057*9+8], INIT[1056*9+8], + INIT[1055*9+8], INIT[1054*9+8], INIT[1053*9+8], INIT[1052*9+8], + INIT[1051*9+8], INIT[1050*9+8], INIT[1049*9+8], INIT[1048*9+8], + INIT[1047*9+8], INIT[1046*9+8], INIT[1045*9+8], INIT[1044*9+8], + INIT[1043*9+8], INIT[1042*9+8], INIT[1041*9+8], INIT[1040*9+8], + INIT[1039*9+8], INIT[1038*9+8], INIT[1037*9+8], INIT[1036*9+8], + INIT[1035*9+8], INIT[1034*9+8], INIT[1033*9+8], INIT[1032*9+8], + INIT[1031*9+8], INIT[1030*9+8], INIT[1029*9+8], INIT[1028*9+8], + INIT[1027*9+8], INIT[1026*9+8], INIT[1025*9+8], INIT[1024*9+8]}), +.INITP_05({INIT[1535*9+8], INIT[1534*9+8], INIT[1533*9+8], INIT[1532*9+8], + INIT[1531*9+8], INIT[1530*9+8], INIT[1529*9+8], INIT[1528*9+8], + INIT[1527*9+8], INIT[1526*9+8], INIT[1525*9+8], INIT[1524*9+8], + INIT[1523*9+8], INIT[1522*9+8], INIT[1521*9+8], INIT[1520*9+8], + INIT[1519*9+8], INIT[1518*9+8], INIT[1517*9+8], INIT[1516*9+8], + INIT[1515*9+8], INIT[1514*9+8], INIT[1513*9+8], INIT[1512*9+8], + INIT[1511*9+8], INIT[1510*9+8], INIT[1509*9+8], INIT[1508*9+8], + INIT[1507*9+8], INIT[1506*9+8], INIT[1505*9+8], INIT[1504*9+8], + INIT[1503*9+8], INIT[1502*9+8], INIT[1501*9+8], INIT[1500*9+8], + INIT[1499*9+8], INIT[1498*9+8], INIT[1497*9+8], INIT[1496*9+8], + INIT[1495*9+8], INIT[1494*9+8], INIT[1493*9+8], INIT[1492*9+8], + INIT[1491*9+8], INIT[1490*9+8], INIT[1489*9+8], INIT[1488*9+8], + INIT[1487*9+8], INIT[1486*9+8], INIT[1485*9+8], INIT[1484*9+8], + INIT[1483*9+8], INIT[1482*9+8], INIT[1481*9+8], INIT[1480*9+8], + INIT[1479*9+8], INIT[1478*9+8], INIT[1477*9+8], INIT[1476*9+8], + INIT[1475*9+8], INIT[1474*9+8], INIT[1473*9+8], INIT[1472*9+8], + INIT[1471*9+8], INIT[1470*9+8], INIT[1469*9+8], INIT[1468*9+8], + INIT[1467*9+8], INIT[1466*9+8], INIT[1465*9+8], INIT[1464*9+8], + INIT[1463*9+8], INIT[1462*9+8], INIT[1461*9+8], INIT[1460*9+8], + INIT[1459*9+8], INIT[1458*9+8], INIT[1457*9+8], INIT[1456*9+8], + INIT[1455*9+8], INIT[1454*9+8], INIT[1453*9+8], INIT[1452*9+8], + INIT[1451*9+8], INIT[1450*9+8], INIT[1449*9+8], INIT[1448*9+8], + INIT[1447*9+8], INIT[1446*9+8], INIT[1445*9+8], INIT[1444*9+8], + INIT[1443*9+8], INIT[1442*9+8], INIT[1441*9+8], INIT[1440*9+8], + INIT[1439*9+8], INIT[1438*9+8], INIT[1437*9+8], INIT[1436*9+8], + INIT[1435*9+8], INIT[1434*9+8], INIT[1433*9+8], INIT[1432*9+8], + INIT[1431*9+8], INIT[1430*9+8], INIT[1429*9+8], INIT[1428*9+8], + INIT[1427*9+8], INIT[1426*9+8], INIT[1425*9+8], INIT[1424*9+8], + INIT[1423*9+8], INIT[1422*9+8], INIT[1421*9+8], INIT[1420*9+8], + INIT[1419*9+8], INIT[1418*9+8], INIT[1417*9+8], INIT[1416*9+8], + INIT[1415*9+8], INIT[1414*9+8], INIT[1413*9+8], INIT[1412*9+8], + INIT[1411*9+8], INIT[1410*9+8], INIT[1409*9+8], INIT[1408*9+8], + INIT[1407*9+8], INIT[1406*9+8], INIT[1405*9+8], INIT[1404*9+8], + INIT[1403*9+8], INIT[1402*9+8], INIT[1401*9+8], INIT[1400*9+8], + INIT[1399*9+8], INIT[1398*9+8], INIT[1397*9+8], INIT[1396*9+8], + INIT[1395*9+8], INIT[1394*9+8], INIT[1393*9+8], INIT[1392*9+8], + INIT[1391*9+8], INIT[1390*9+8], INIT[1389*9+8], INIT[1388*9+8], + INIT[1387*9+8], INIT[1386*9+8], INIT[1385*9+8], INIT[1384*9+8], + INIT[1383*9+8], INIT[1382*9+8], INIT[1381*9+8], INIT[1380*9+8], + INIT[1379*9+8], INIT[1378*9+8], INIT[1377*9+8], INIT[1376*9+8], + INIT[1375*9+8], INIT[1374*9+8], INIT[1373*9+8], INIT[1372*9+8], + INIT[1371*9+8], INIT[1370*9+8], INIT[1369*9+8], INIT[1368*9+8], + INIT[1367*9+8], INIT[1366*9+8], INIT[1365*9+8], INIT[1364*9+8], + INIT[1363*9+8], INIT[1362*9+8], INIT[1361*9+8], INIT[1360*9+8], + INIT[1359*9+8], INIT[1358*9+8], INIT[1357*9+8], INIT[1356*9+8], + INIT[1355*9+8], INIT[1354*9+8], INIT[1353*9+8], INIT[1352*9+8], + INIT[1351*9+8], INIT[1350*9+8], INIT[1349*9+8], INIT[1348*9+8], + INIT[1347*9+8], INIT[1346*9+8], INIT[1345*9+8], INIT[1344*9+8], + INIT[1343*9+8], INIT[1342*9+8], INIT[1341*9+8], INIT[1340*9+8], + INIT[1339*9+8], INIT[1338*9+8], INIT[1337*9+8], INIT[1336*9+8], + INIT[1335*9+8], INIT[1334*9+8], INIT[1333*9+8], INIT[1332*9+8], + INIT[1331*9+8], INIT[1330*9+8], INIT[1329*9+8], INIT[1328*9+8], + INIT[1327*9+8], INIT[1326*9+8], INIT[1325*9+8], INIT[1324*9+8], + INIT[1323*9+8], INIT[1322*9+8], INIT[1321*9+8], INIT[1320*9+8], + INIT[1319*9+8], INIT[1318*9+8], INIT[1317*9+8], INIT[1316*9+8], + INIT[1315*9+8], INIT[1314*9+8], INIT[1313*9+8], INIT[1312*9+8], + INIT[1311*9+8], INIT[1310*9+8], INIT[1309*9+8], INIT[1308*9+8], + INIT[1307*9+8], INIT[1306*9+8], INIT[1305*9+8], INIT[1304*9+8], + INIT[1303*9+8], INIT[1302*9+8], INIT[1301*9+8], INIT[1300*9+8], + INIT[1299*9+8], INIT[1298*9+8], INIT[1297*9+8], INIT[1296*9+8], + INIT[1295*9+8], INIT[1294*9+8], INIT[1293*9+8], INIT[1292*9+8], + INIT[1291*9+8], INIT[1290*9+8], INIT[1289*9+8], INIT[1288*9+8], + INIT[1287*9+8], INIT[1286*9+8], INIT[1285*9+8], INIT[1284*9+8], + INIT[1283*9+8], INIT[1282*9+8], INIT[1281*9+8], INIT[1280*9+8]}), +.INITP_06({INIT[1791*9+8], INIT[1790*9+8], INIT[1789*9+8], INIT[1788*9+8], + INIT[1787*9+8], INIT[1786*9+8], INIT[1785*9+8], INIT[1784*9+8], + INIT[1783*9+8], INIT[1782*9+8], INIT[1781*9+8], INIT[1780*9+8], + INIT[1779*9+8], INIT[1778*9+8], INIT[1777*9+8], INIT[1776*9+8], + INIT[1775*9+8], INIT[1774*9+8], INIT[1773*9+8], INIT[1772*9+8], + INIT[1771*9+8], INIT[1770*9+8], INIT[1769*9+8], INIT[1768*9+8], + INIT[1767*9+8], INIT[1766*9+8], INIT[1765*9+8], INIT[1764*9+8], + INIT[1763*9+8], INIT[1762*9+8], INIT[1761*9+8], INIT[1760*9+8], + INIT[1759*9+8], INIT[1758*9+8], INIT[1757*9+8], INIT[1756*9+8], + INIT[1755*9+8], INIT[1754*9+8], INIT[1753*9+8], INIT[1752*9+8], + INIT[1751*9+8], INIT[1750*9+8], INIT[1749*9+8], INIT[1748*9+8], + INIT[1747*9+8], INIT[1746*9+8], INIT[1745*9+8], INIT[1744*9+8], + INIT[1743*9+8], INIT[1742*9+8], INIT[1741*9+8], INIT[1740*9+8], + INIT[1739*9+8], INIT[1738*9+8], INIT[1737*9+8], INIT[1736*9+8], + INIT[1735*9+8], INIT[1734*9+8], INIT[1733*9+8], INIT[1732*9+8], + INIT[1731*9+8], INIT[1730*9+8], INIT[1729*9+8], INIT[1728*9+8], + INIT[1727*9+8], INIT[1726*9+8], INIT[1725*9+8], INIT[1724*9+8], + INIT[1723*9+8], INIT[1722*9+8], INIT[1721*9+8], INIT[1720*9+8], + INIT[1719*9+8], INIT[1718*9+8], INIT[1717*9+8], INIT[1716*9+8], + INIT[1715*9+8], INIT[1714*9+8], INIT[1713*9+8], INIT[1712*9+8], + INIT[1711*9+8], INIT[1710*9+8], INIT[1709*9+8], INIT[1708*9+8], + INIT[1707*9+8], INIT[1706*9+8], INIT[1705*9+8], INIT[1704*9+8], + INIT[1703*9+8], INIT[1702*9+8], INIT[1701*9+8], INIT[1700*9+8], + INIT[1699*9+8], INIT[1698*9+8], INIT[1697*9+8], INIT[1696*9+8], + INIT[1695*9+8], INIT[1694*9+8], INIT[1693*9+8], INIT[1692*9+8], + INIT[1691*9+8], INIT[1690*9+8], INIT[1689*9+8], INIT[1688*9+8], + INIT[1687*9+8], INIT[1686*9+8], INIT[1685*9+8], INIT[1684*9+8], + INIT[1683*9+8], INIT[1682*9+8], INIT[1681*9+8], INIT[1680*9+8], + INIT[1679*9+8], INIT[1678*9+8], INIT[1677*9+8], INIT[1676*9+8], + INIT[1675*9+8], INIT[1674*9+8], INIT[1673*9+8], INIT[1672*9+8], + INIT[1671*9+8], INIT[1670*9+8], INIT[1669*9+8], INIT[1668*9+8], + INIT[1667*9+8], INIT[1666*9+8], INIT[1665*9+8], INIT[1664*9+8], + INIT[1663*9+8], INIT[1662*9+8], INIT[1661*9+8], INIT[1660*9+8], + INIT[1659*9+8], INIT[1658*9+8], INIT[1657*9+8], INIT[1656*9+8], + INIT[1655*9+8], INIT[1654*9+8], INIT[1653*9+8], INIT[1652*9+8], + INIT[1651*9+8], INIT[1650*9+8], INIT[1649*9+8], INIT[1648*9+8], + INIT[1647*9+8], INIT[1646*9+8], INIT[1645*9+8], INIT[1644*9+8], + INIT[1643*9+8], INIT[1642*9+8], INIT[1641*9+8], INIT[1640*9+8], + INIT[1639*9+8], INIT[1638*9+8], INIT[1637*9+8], INIT[1636*9+8], + INIT[1635*9+8], INIT[1634*9+8], INIT[1633*9+8], INIT[1632*9+8], + INIT[1631*9+8], INIT[1630*9+8], INIT[1629*9+8], INIT[1628*9+8], + INIT[1627*9+8], INIT[1626*9+8], INIT[1625*9+8], INIT[1624*9+8], + INIT[1623*9+8], INIT[1622*9+8], INIT[1621*9+8], INIT[1620*9+8], + INIT[1619*9+8], INIT[1618*9+8], INIT[1617*9+8], INIT[1616*9+8], + INIT[1615*9+8], INIT[1614*9+8], INIT[1613*9+8], INIT[1612*9+8], + INIT[1611*9+8], INIT[1610*9+8], INIT[1609*9+8], INIT[1608*9+8], + INIT[1607*9+8], INIT[1606*9+8], INIT[1605*9+8], INIT[1604*9+8], + INIT[1603*9+8], INIT[1602*9+8], INIT[1601*9+8], INIT[1600*9+8], + INIT[1599*9+8], INIT[1598*9+8], INIT[1597*9+8], INIT[1596*9+8], + INIT[1595*9+8], INIT[1594*9+8], INIT[1593*9+8], INIT[1592*9+8], + INIT[1591*9+8], INIT[1590*9+8], INIT[1589*9+8], INIT[1588*9+8], + INIT[1587*9+8], INIT[1586*9+8], INIT[1585*9+8], INIT[1584*9+8], + INIT[1583*9+8], INIT[1582*9+8], INIT[1581*9+8], INIT[1580*9+8], + INIT[1579*9+8], INIT[1578*9+8], INIT[1577*9+8], INIT[1576*9+8], + INIT[1575*9+8], INIT[1574*9+8], INIT[1573*9+8], INIT[1572*9+8], + INIT[1571*9+8], INIT[1570*9+8], INIT[1569*9+8], INIT[1568*9+8], + INIT[1567*9+8], INIT[1566*9+8], INIT[1565*9+8], INIT[1564*9+8], + INIT[1563*9+8], INIT[1562*9+8], INIT[1561*9+8], INIT[1560*9+8], + INIT[1559*9+8], INIT[1558*9+8], INIT[1557*9+8], INIT[1556*9+8], + INIT[1555*9+8], INIT[1554*9+8], INIT[1553*9+8], INIT[1552*9+8], + INIT[1551*9+8], INIT[1550*9+8], INIT[1549*9+8], INIT[1548*9+8], + INIT[1547*9+8], INIT[1546*9+8], INIT[1545*9+8], INIT[1544*9+8], + INIT[1543*9+8], INIT[1542*9+8], INIT[1541*9+8], INIT[1540*9+8], + INIT[1539*9+8], INIT[1538*9+8], INIT[1537*9+8], INIT[1536*9+8]}), +.INITP_07({INIT[2047*9+8], INIT[2046*9+8], INIT[2045*9+8], INIT[2044*9+8], + INIT[2043*9+8], INIT[2042*9+8], INIT[2041*9+8], INIT[2040*9+8], + INIT[2039*9+8], INIT[2038*9+8], INIT[2037*9+8], INIT[2036*9+8], + INIT[2035*9+8], INIT[2034*9+8], INIT[2033*9+8], INIT[2032*9+8], + INIT[2031*9+8], INIT[2030*9+8], INIT[2029*9+8], INIT[2028*9+8], + INIT[2027*9+8], INIT[2026*9+8], INIT[2025*9+8], INIT[2024*9+8], + INIT[2023*9+8], INIT[2022*9+8], INIT[2021*9+8], INIT[2020*9+8], + INIT[2019*9+8], INIT[2018*9+8], INIT[2017*9+8], INIT[2016*9+8], + INIT[2015*9+8], INIT[2014*9+8], INIT[2013*9+8], INIT[2012*9+8], + INIT[2011*9+8], INIT[2010*9+8], INIT[2009*9+8], INIT[2008*9+8], + INIT[2007*9+8], INIT[2006*9+8], INIT[2005*9+8], INIT[2004*9+8], + INIT[2003*9+8], INIT[2002*9+8], INIT[2001*9+8], INIT[2000*9+8], + INIT[1999*9+8], INIT[1998*9+8], INIT[1997*9+8], INIT[1996*9+8], + INIT[1995*9+8], INIT[1994*9+8], INIT[1993*9+8], INIT[1992*9+8], + INIT[1991*9+8], INIT[1990*9+8], INIT[1989*9+8], INIT[1988*9+8], + INIT[1987*9+8], INIT[1986*9+8], INIT[1985*9+8], INIT[1984*9+8], + INIT[1983*9+8], INIT[1982*9+8], INIT[1981*9+8], INIT[1980*9+8], + INIT[1979*9+8], INIT[1978*9+8], INIT[1977*9+8], INIT[1976*9+8], + INIT[1975*9+8], INIT[1974*9+8], INIT[1973*9+8], INIT[1972*9+8], + INIT[1971*9+8], INIT[1970*9+8], INIT[1969*9+8], INIT[1968*9+8], + INIT[1967*9+8], INIT[1966*9+8], INIT[1965*9+8], INIT[1964*9+8], + INIT[1963*9+8], INIT[1962*9+8], INIT[1961*9+8], INIT[1960*9+8], + INIT[1959*9+8], INIT[1958*9+8], INIT[1957*9+8], INIT[1956*9+8], + INIT[1955*9+8], INIT[1954*9+8], INIT[1953*9+8], INIT[1952*9+8], + INIT[1951*9+8], INIT[1950*9+8], INIT[1949*9+8], INIT[1948*9+8], + INIT[1947*9+8], INIT[1946*9+8], INIT[1945*9+8], INIT[1944*9+8], + INIT[1943*9+8], INIT[1942*9+8], INIT[1941*9+8], INIT[1940*9+8], + INIT[1939*9+8], INIT[1938*9+8], INIT[1937*9+8], INIT[1936*9+8], + INIT[1935*9+8], INIT[1934*9+8], INIT[1933*9+8], INIT[1932*9+8], + INIT[1931*9+8], INIT[1930*9+8], INIT[1929*9+8], INIT[1928*9+8], + INIT[1927*9+8], INIT[1926*9+8], INIT[1925*9+8], INIT[1924*9+8], + INIT[1923*9+8], INIT[1922*9+8], INIT[1921*9+8], INIT[1920*9+8], + INIT[1919*9+8], INIT[1918*9+8], INIT[1917*9+8], INIT[1916*9+8], + INIT[1915*9+8], INIT[1914*9+8], INIT[1913*9+8], INIT[1912*9+8], + INIT[1911*9+8], INIT[1910*9+8], INIT[1909*9+8], INIT[1908*9+8], + INIT[1907*9+8], INIT[1906*9+8], INIT[1905*9+8], INIT[1904*9+8], + INIT[1903*9+8], INIT[1902*9+8], INIT[1901*9+8], INIT[1900*9+8], + INIT[1899*9+8], INIT[1898*9+8], INIT[1897*9+8], INIT[1896*9+8], + INIT[1895*9+8], INIT[1894*9+8], INIT[1893*9+8], INIT[1892*9+8], + INIT[1891*9+8], INIT[1890*9+8], INIT[1889*9+8], INIT[1888*9+8], + INIT[1887*9+8], INIT[1886*9+8], INIT[1885*9+8], INIT[1884*9+8], + INIT[1883*9+8], INIT[1882*9+8], INIT[1881*9+8], INIT[1880*9+8], + INIT[1879*9+8], INIT[1878*9+8], INIT[1877*9+8], INIT[1876*9+8], + INIT[1875*9+8], INIT[1874*9+8], INIT[1873*9+8], INIT[1872*9+8], + INIT[1871*9+8], INIT[1870*9+8], INIT[1869*9+8], INIT[1868*9+8], + INIT[1867*9+8], INIT[1866*9+8], INIT[1865*9+8], INIT[1864*9+8], + INIT[1863*9+8], INIT[1862*9+8], INIT[1861*9+8], INIT[1860*9+8], + INIT[1859*9+8], INIT[1858*9+8], INIT[1857*9+8], INIT[1856*9+8], + INIT[1855*9+8], INIT[1854*9+8], INIT[1853*9+8], INIT[1852*9+8], + INIT[1851*9+8], INIT[1850*9+8], INIT[1849*9+8], INIT[1848*9+8], + INIT[1847*9+8], INIT[1846*9+8], INIT[1845*9+8], INIT[1844*9+8], + INIT[1843*9+8], INIT[1842*9+8], INIT[1841*9+8], INIT[1840*9+8], + INIT[1839*9+8], INIT[1838*9+8], INIT[1837*9+8], INIT[1836*9+8], + INIT[1835*9+8], INIT[1834*9+8], INIT[1833*9+8], INIT[1832*9+8], + INIT[1831*9+8], INIT[1830*9+8], INIT[1829*9+8], INIT[1828*9+8], + INIT[1827*9+8], INIT[1826*9+8], INIT[1825*9+8], INIT[1824*9+8], + INIT[1823*9+8], INIT[1822*9+8], INIT[1821*9+8], INIT[1820*9+8], + INIT[1819*9+8], INIT[1818*9+8], INIT[1817*9+8], INIT[1816*9+8], + INIT[1815*9+8], INIT[1814*9+8], INIT[1813*9+8], INIT[1812*9+8], + INIT[1811*9+8], INIT[1810*9+8], INIT[1809*9+8], INIT[1808*9+8], + INIT[1807*9+8], INIT[1806*9+8], INIT[1805*9+8], INIT[1804*9+8], + INIT[1803*9+8], INIT[1802*9+8], INIT[1801*9+8], INIT[1800*9+8], + INIT[1799*9+8], INIT[1798*9+8], INIT[1797*9+8], INIT[1796*9+8], + INIT[1795*9+8], INIT[1794*9+8], INIT[1793*9+8], INIT[1792*9+8]}), +.INIT_00({INIT[ 31*9 +: 8], INIT[ 30*9 +: 8], INIT[ 29*9 +: 8], INIT[ 28*9 +: 8], + INIT[ 27*9 +: 8], INIT[ 26*9 +: 8], INIT[ 25*9 +: 8], INIT[ 24*9 +: 8], + INIT[ 23*9 +: 8], INIT[ 22*9 +: 8], INIT[ 21*9 +: 8], INIT[ 20*9 +: 8], + INIT[ 19*9 +: 8], INIT[ 18*9 +: 8], INIT[ 17*9 +: 8], INIT[ 16*9 +: 8], + INIT[ 15*9 +: 8], INIT[ 14*9 +: 8], INIT[ 13*9 +: 8], INIT[ 12*9 +: 8], + INIT[ 11*9 +: 8], INIT[ 10*9 +: 8], INIT[ 9*9 +: 8], INIT[ 8*9 +: 8], + INIT[ 7*9 +: 8], INIT[ 6*9 +: 8], INIT[ 5*9 +: 8], INIT[ 4*9 +: 8], + INIT[ 3*9 +: 8], INIT[ 2*9 +: 8], INIT[ 1*9 +: 8], INIT[ 0*9 +: 8]}), +.INIT_01({INIT[ 63*9 +: 8], INIT[ 62*9 +: 8], INIT[ 61*9 +: 8], INIT[ 60*9 +: 8], + INIT[ 59*9 +: 8], INIT[ 58*9 +: 8], INIT[ 57*9 +: 8], INIT[ 56*9 +: 8], + INIT[ 55*9 +: 8], INIT[ 54*9 +: 8], INIT[ 53*9 +: 8], INIT[ 52*9 +: 8], + INIT[ 51*9 +: 8], INIT[ 50*9 +: 8], INIT[ 49*9 +: 8], INIT[ 48*9 +: 8], + INIT[ 47*9 +: 8], INIT[ 46*9 +: 8], INIT[ 45*9 +: 8], INIT[ 44*9 +: 8], + INIT[ 43*9 +: 8], INIT[ 42*9 +: 8], INIT[ 41*9 +: 8], INIT[ 40*9 +: 8], + INIT[ 39*9 +: 8], INIT[ 38*9 +: 8], INIT[ 37*9 +: 8], INIT[ 36*9 +: 8], + INIT[ 35*9 +: 8], INIT[ 34*9 +: 8], INIT[ 33*9 +: 8], INIT[ 32*9 +: 8]}), +.INIT_02({INIT[ 95*9 +: 8], INIT[ 94*9 +: 8], INIT[ 93*9 +: 8], INIT[ 92*9 +: 8], + INIT[ 91*9 +: 8], INIT[ 90*9 +: 8], INIT[ 89*9 +: 8], INIT[ 88*9 +: 8], + INIT[ 87*9 +: 8], INIT[ 86*9 +: 8], INIT[ 85*9 +: 8], INIT[ 84*9 +: 8], + INIT[ 83*9 +: 8], INIT[ 82*9 +: 8], INIT[ 81*9 +: 8], INIT[ 80*9 +: 8], + INIT[ 79*9 +: 8], INIT[ 78*9 +: 8], INIT[ 77*9 +: 8], INIT[ 76*9 +: 8], + INIT[ 75*9 +: 8], INIT[ 74*9 +: 8], INIT[ 73*9 +: 8], INIT[ 72*9 +: 8], + INIT[ 71*9 +: 8], INIT[ 70*9 +: 8], INIT[ 69*9 +: 8], INIT[ 68*9 +: 8], + INIT[ 67*9 +: 8], INIT[ 66*9 +: 8], INIT[ 65*9 +: 8], INIT[ 64*9 +: 8]}), +.INIT_03({INIT[127*9 +: 8], INIT[126*9 +: 8], INIT[125*9 +: 8], INIT[124*9 +: 8], + INIT[123*9 +: 8], INIT[122*9 +: 8], INIT[121*9 +: 8], INIT[120*9 +: 8], + INIT[119*9 +: 8], INIT[118*9 +: 8], INIT[117*9 +: 8], INIT[116*9 +: 8], + INIT[115*9 +: 8], INIT[114*9 +: 8], INIT[113*9 +: 8], INIT[112*9 +: 8], + INIT[111*9 +: 8], INIT[110*9 +: 8], INIT[109*9 +: 8], INIT[108*9 +: 8], + INIT[107*9 +: 8], INIT[106*9 +: 8], INIT[105*9 +: 8], INIT[104*9 +: 8], + INIT[103*9 +: 8], INIT[102*9 +: 8], INIT[101*9 +: 8], INIT[100*9 +: 8], + INIT[ 99*9 +: 8], INIT[ 98*9 +: 8], INIT[ 97*9 +: 8], INIT[ 96*9 +: 8]}), +.INIT_04({INIT[159*9 +: 8], INIT[158*9 +: 8], INIT[157*9 +: 8], INIT[156*9 +: 8], + INIT[155*9 +: 8], INIT[154*9 +: 8], INIT[153*9 +: 8], INIT[152*9 +: 8], + INIT[151*9 +: 8], INIT[150*9 +: 8], INIT[149*9 +: 8], INIT[148*9 +: 8], + INIT[147*9 +: 8], INIT[146*9 +: 8], INIT[145*9 +: 8], INIT[144*9 +: 8], + INIT[143*9 +: 8], INIT[142*9 +: 8], INIT[141*9 +: 8], INIT[140*9 +: 8], + INIT[139*9 +: 8], INIT[138*9 +: 8], INIT[137*9 +: 8], INIT[136*9 +: 8], + INIT[135*9 +: 8], INIT[134*9 +: 8], INIT[133*9 +: 8], INIT[132*9 +: 8], + INIT[131*9 +: 8], INIT[130*9 +: 8], INIT[129*9 +: 8], INIT[128*9 +: 8]}), +.INIT_05({INIT[191*9 +: 8], INIT[190*9 +: 8], INIT[189*9 +: 8], INIT[188*9 +: 8], + INIT[187*9 +: 8], INIT[186*9 +: 8], INIT[185*9 +: 8], INIT[184*9 +: 8], + INIT[183*9 +: 8], INIT[182*9 +: 8], INIT[181*9 +: 8], INIT[180*9 +: 8], + INIT[179*9 +: 8], INIT[178*9 +: 8], INIT[177*9 +: 8], INIT[176*9 +: 8], + INIT[175*9 +: 8], INIT[174*9 +: 8], INIT[173*9 +: 8], INIT[172*9 +: 8], + INIT[171*9 +: 8], INIT[170*9 +: 8], INIT[169*9 +: 8], INIT[168*9 +: 8], + INIT[167*9 +: 8], INIT[166*9 +: 8], INIT[165*9 +: 8], INIT[164*9 +: 8], + INIT[163*9 +: 8], INIT[162*9 +: 8], INIT[161*9 +: 8], INIT[160*9 +: 8]}), +.INIT_06({INIT[223*9 +: 8], INIT[222*9 +: 8], INIT[221*9 +: 8], INIT[220*9 +: 8], + INIT[219*9 +: 8], INIT[218*9 +: 8], INIT[217*9 +: 8], INIT[216*9 +: 8], + INIT[215*9 +: 8], INIT[214*9 +: 8], INIT[213*9 +: 8], INIT[212*9 +: 8], + INIT[211*9 +: 8], INIT[210*9 +: 8], INIT[209*9 +: 8], INIT[208*9 +: 8], + INIT[207*9 +: 8], INIT[206*9 +: 8], INIT[205*9 +: 8], INIT[204*9 +: 8], + INIT[203*9 +: 8], INIT[202*9 +: 8], INIT[201*9 +: 8], INIT[200*9 +: 8], + INIT[199*9 +: 8], INIT[198*9 +: 8], INIT[197*9 +: 8], INIT[196*9 +: 8], + INIT[195*9 +: 8], INIT[194*9 +: 8], INIT[193*9 +: 8], INIT[192*9 +: 8]}), +.INIT_07({INIT[255*9 +: 8], INIT[254*9 +: 8], INIT[253*9 +: 8], INIT[252*9 +: 8], + INIT[251*9 +: 8], INIT[250*9 +: 8], INIT[249*9 +: 8], INIT[248*9 +: 8], + INIT[247*9 +: 8], INIT[246*9 +: 8], INIT[245*9 +: 8], INIT[244*9 +: 8], + INIT[243*9 +: 8], INIT[242*9 +: 8], INIT[241*9 +: 8], INIT[240*9 +: 8], + INIT[239*9 +: 8], INIT[238*9 +: 8], INIT[237*9 +: 8], INIT[236*9 +: 8], + INIT[235*9 +: 8], INIT[234*9 +: 8], INIT[233*9 +: 8], INIT[232*9 +: 8], + INIT[231*9 +: 8], INIT[230*9 +: 8], INIT[229*9 +: 8], INIT[228*9 +: 8], + INIT[227*9 +: 8], INIT[226*9 +: 8], INIT[225*9 +: 8], INIT[224*9 +: 8]}), +.INIT_08({INIT[287*9 +: 8], INIT[286*9 +: 8], INIT[285*9 +: 8], INIT[284*9 +: 8], + INIT[283*9 +: 8], INIT[282*9 +: 8], INIT[281*9 +: 8], INIT[280*9 +: 8], + INIT[279*9 +: 8], INIT[278*9 +: 8], INIT[277*9 +: 8], INIT[276*9 +: 8], + INIT[275*9 +: 8], INIT[274*9 +: 8], INIT[273*9 +: 8], INIT[272*9 +: 8], + INIT[271*9 +: 8], INIT[270*9 +: 8], INIT[269*9 +: 8], INIT[268*9 +: 8], + INIT[267*9 +: 8], INIT[266*9 +: 8], INIT[265*9 +: 8], INIT[264*9 +: 8], + INIT[263*9 +: 8], INIT[262*9 +: 8], INIT[261*9 +: 8], INIT[260*9 +: 8], + INIT[259*9 +: 8], INIT[258*9 +: 8], INIT[257*9 +: 8], INIT[256*9 +: 8]}), +.INIT_09({INIT[319*9 +: 8], INIT[318*9 +: 8], INIT[317*9 +: 8], INIT[316*9 +: 8], + INIT[315*9 +: 8], INIT[314*9 +: 8], INIT[313*9 +: 8], INIT[312*9 +: 8], + INIT[311*9 +: 8], INIT[310*9 +: 8], INIT[309*9 +: 8], INIT[308*9 +: 8], + INIT[307*9 +: 8], INIT[306*9 +: 8], INIT[305*9 +: 8], INIT[304*9 +: 8], + INIT[303*9 +: 8], INIT[302*9 +: 8], INIT[301*9 +: 8], INIT[300*9 +: 8], + INIT[299*9 +: 8], INIT[298*9 +: 8], INIT[297*9 +: 8], INIT[296*9 +: 8], + INIT[295*9 +: 8], INIT[294*9 +: 8], INIT[293*9 +: 8], INIT[292*9 +: 8], + INIT[291*9 +: 8], INIT[290*9 +: 8], INIT[289*9 +: 8], INIT[288*9 +: 8]}), +.INIT_0A({INIT[351*9 +: 8], INIT[350*9 +: 8], INIT[349*9 +: 8], INIT[348*9 +: 8], + INIT[347*9 +: 8], INIT[346*9 +: 8], INIT[345*9 +: 8], INIT[344*9 +: 8], + INIT[343*9 +: 8], INIT[342*9 +: 8], INIT[341*9 +: 8], INIT[340*9 +: 8], + INIT[339*9 +: 8], INIT[338*9 +: 8], INIT[337*9 +: 8], INIT[336*9 +: 8], + INIT[335*9 +: 8], INIT[334*9 +: 8], INIT[333*9 +: 8], INIT[332*9 +: 8], + INIT[331*9 +: 8], INIT[330*9 +: 8], INIT[329*9 +: 8], INIT[328*9 +: 8], + INIT[327*9 +: 8], INIT[326*9 +: 8], INIT[325*9 +: 8], INIT[324*9 +: 8], + INIT[323*9 +: 8], INIT[322*9 +: 8], INIT[321*9 +: 8], INIT[320*9 +: 8]}), +.INIT_0B({INIT[383*9 +: 8], INIT[382*9 +: 8], INIT[381*9 +: 8], INIT[380*9 +: 8], + INIT[379*9 +: 8], INIT[378*9 +: 8], INIT[377*9 +: 8], INIT[376*9 +: 8], + INIT[375*9 +: 8], INIT[374*9 +: 8], INIT[373*9 +: 8], INIT[372*9 +: 8], + INIT[371*9 +: 8], INIT[370*9 +: 8], INIT[369*9 +: 8], INIT[368*9 +: 8], + INIT[367*9 +: 8], INIT[366*9 +: 8], INIT[365*9 +: 8], INIT[364*9 +: 8], + INIT[363*9 +: 8], INIT[362*9 +: 8], INIT[361*9 +: 8], INIT[360*9 +: 8], + INIT[359*9 +: 8], INIT[358*9 +: 8], INIT[357*9 +: 8], INIT[356*9 +: 8], + INIT[355*9 +: 8], INIT[354*9 +: 8], INIT[353*9 +: 8], INIT[352*9 +: 8]}), +.INIT_0C({INIT[415*9 +: 8], INIT[414*9 +: 8], INIT[413*9 +: 8], INIT[412*9 +: 8], + INIT[411*9 +: 8], INIT[410*9 +: 8], INIT[409*9 +: 8], INIT[408*9 +: 8], + INIT[407*9 +: 8], INIT[406*9 +: 8], INIT[405*9 +: 8], INIT[404*9 +: 8], + INIT[403*9 +: 8], INIT[402*9 +: 8], INIT[401*9 +: 8], INIT[400*9 +: 8], + INIT[399*9 +: 8], INIT[398*9 +: 8], INIT[397*9 +: 8], INIT[396*9 +: 8], + INIT[395*9 +: 8], INIT[394*9 +: 8], INIT[393*9 +: 8], INIT[392*9 +: 8], + INIT[391*9 +: 8], INIT[390*9 +: 8], INIT[389*9 +: 8], INIT[388*9 +: 8], + INIT[387*9 +: 8], INIT[386*9 +: 8], INIT[385*9 +: 8], INIT[384*9 +: 8]}), +.INIT_0D({INIT[447*9 +: 8], INIT[446*9 +: 8], INIT[445*9 +: 8], INIT[444*9 +: 8], + INIT[443*9 +: 8], INIT[442*9 +: 8], INIT[441*9 +: 8], INIT[440*9 +: 8], + INIT[439*9 +: 8], INIT[438*9 +: 8], INIT[437*9 +: 8], INIT[436*9 +: 8], + INIT[435*9 +: 8], INIT[434*9 +: 8], INIT[433*9 +: 8], INIT[432*9 +: 8], + INIT[431*9 +: 8], INIT[430*9 +: 8], INIT[429*9 +: 8], INIT[428*9 +: 8], + INIT[427*9 +: 8], INIT[426*9 +: 8], INIT[425*9 +: 8], INIT[424*9 +: 8], + INIT[423*9 +: 8], INIT[422*9 +: 8], INIT[421*9 +: 8], INIT[420*9 +: 8], + INIT[419*9 +: 8], INIT[418*9 +: 8], INIT[417*9 +: 8], INIT[416*9 +: 8]}), +.INIT_0E({INIT[479*9 +: 8], INIT[478*9 +: 8], INIT[477*9 +: 8], INIT[476*9 +: 8], + INIT[475*9 +: 8], INIT[474*9 +: 8], INIT[473*9 +: 8], INIT[472*9 +: 8], + INIT[471*9 +: 8], INIT[470*9 +: 8], INIT[469*9 +: 8], INIT[468*9 +: 8], + INIT[467*9 +: 8], INIT[466*9 +: 8], INIT[465*9 +: 8], INIT[464*9 +: 8], + INIT[463*9 +: 8], INIT[462*9 +: 8], INIT[461*9 +: 8], INIT[460*9 +: 8], + INIT[459*9 +: 8], INIT[458*9 +: 8], INIT[457*9 +: 8], INIT[456*9 +: 8], + INIT[455*9 +: 8], INIT[454*9 +: 8], INIT[453*9 +: 8], INIT[452*9 +: 8], + INIT[451*9 +: 8], INIT[450*9 +: 8], INIT[449*9 +: 8], INIT[448*9 +: 8]}), +.INIT_0F({INIT[511*9 +: 8], INIT[510*9 +: 8], INIT[509*9 +: 8], INIT[508*9 +: 8], + INIT[507*9 +: 8], INIT[506*9 +: 8], INIT[505*9 +: 8], INIT[504*9 +: 8], + INIT[503*9 +: 8], INIT[502*9 +: 8], INIT[501*9 +: 8], INIT[500*9 +: 8], + INIT[499*9 +: 8], INIT[498*9 +: 8], INIT[497*9 +: 8], INIT[496*9 +: 8], + INIT[495*9 +: 8], INIT[494*9 +: 8], INIT[493*9 +: 8], INIT[492*9 +: 8], + INIT[491*9 +: 8], INIT[490*9 +: 8], INIT[489*9 +: 8], INIT[488*9 +: 8], + INIT[487*9 +: 8], INIT[486*9 +: 8], INIT[485*9 +: 8], INIT[484*9 +: 8], + INIT[483*9 +: 8], INIT[482*9 +: 8], INIT[481*9 +: 8], INIT[480*9 +: 8]}), +.INIT_10({INIT[543*9 +: 8], INIT[542*9 +: 8], INIT[541*9 +: 8], INIT[540*9 +: 8], + INIT[539*9 +: 8], INIT[538*9 +: 8], INIT[537*9 +: 8], INIT[536*9 +: 8], + INIT[535*9 +: 8], INIT[534*9 +: 8], INIT[533*9 +: 8], INIT[532*9 +: 8], + INIT[531*9 +: 8], INIT[530*9 +: 8], INIT[529*9 +: 8], INIT[528*9 +: 8], + INIT[527*9 +: 8], INIT[526*9 +: 8], INIT[525*9 +: 8], INIT[524*9 +: 8], + INIT[523*9 +: 8], INIT[522*9 +: 8], INIT[521*9 +: 8], INIT[520*9 +: 8], + INIT[519*9 +: 8], INIT[518*9 +: 8], INIT[517*9 +: 8], INIT[516*9 +: 8], + INIT[515*9 +: 8], INIT[514*9 +: 8], INIT[513*9 +: 8], INIT[512*9 +: 8]}), +.INIT_11({INIT[575*9 +: 8], INIT[574*9 +: 8], INIT[573*9 +: 8], INIT[572*9 +: 8], + INIT[571*9 +: 8], INIT[570*9 +: 8], INIT[569*9 +: 8], INIT[568*9 +: 8], + INIT[567*9 +: 8], INIT[566*9 +: 8], INIT[565*9 +: 8], INIT[564*9 +: 8], + INIT[563*9 +: 8], INIT[562*9 +: 8], INIT[561*9 +: 8], INIT[560*9 +: 8], + INIT[559*9 +: 8], INIT[558*9 +: 8], INIT[557*9 +: 8], INIT[556*9 +: 8], + INIT[555*9 +: 8], INIT[554*9 +: 8], INIT[553*9 +: 8], INIT[552*9 +: 8], + INIT[551*9 +: 8], INIT[550*9 +: 8], INIT[549*9 +: 8], INIT[548*9 +: 8], + INIT[547*9 +: 8], INIT[546*9 +: 8], INIT[545*9 +: 8], INIT[544*9 +: 8]}), +.INIT_12({INIT[607*9 +: 8], INIT[606*9 +: 8], INIT[605*9 +: 8], INIT[604*9 +: 8], + INIT[603*9 +: 8], INIT[602*9 +: 8], INIT[601*9 +: 8], INIT[600*9 +: 8], + INIT[599*9 +: 8], INIT[598*9 +: 8], INIT[597*9 +: 8], INIT[596*9 +: 8], + INIT[595*9 +: 8], INIT[594*9 +: 8], INIT[593*9 +: 8], INIT[592*9 +: 8], + INIT[591*9 +: 8], INIT[590*9 +: 8], INIT[589*9 +: 8], INIT[588*9 +: 8], + INIT[587*9 +: 8], INIT[586*9 +: 8], INIT[585*9 +: 8], INIT[584*9 +: 8], + INIT[583*9 +: 8], INIT[582*9 +: 8], INIT[581*9 +: 8], INIT[580*9 +: 8], + INIT[579*9 +: 8], INIT[578*9 +: 8], INIT[577*9 +: 8], INIT[576*9 +: 8]}), +.INIT_13({INIT[639*9 +: 8], INIT[638*9 +: 8], INIT[637*9 +: 8], INIT[636*9 +: 8], + INIT[635*9 +: 8], INIT[634*9 +: 8], INIT[633*9 +: 8], INIT[632*9 +: 8], + INIT[631*9 +: 8], INIT[630*9 +: 8], INIT[629*9 +: 8], INIT[628*9 +: 8], + INIT[627*9 +: 8], INIT[626*9 +: 8], INIT[625*9 +: 8], INIT[624*9 +: 8], + INIT[623*9 +: 8], INIT[622*9 +: 8], INIT[621*9 +: 8], INIT[620*9 +: 8], + INIT[619*9 +: 8], INIT[618*9 +: 8], INIT[617*9 +: 8], INIT[616*9 +: 8], + INIT[615*9 +: 8], INIT[614*9 +: 8], INIT[613*9 +: 8], INIT[612*9 +: 8], + INIT[611*9 +: 8], INIT[610*9 +: 8], INIT[609*9 +: 8], INIT[608*9 +: 8]}), +.INIT_14({INIT[671*9 +: 8], INIT[670*9 +: 8], INIT[669*9 +: 8], INIT[668*9 +: 8], + INIT[667*9 +: 8], INIT[666*9 +: 8], INIT[665*9 +: 8], INIT[664*9 +: 8], + INIT[663*9 +: 8], INIT[662*9 +: 8], INIT[661*9 +: 8], INIT[660*9 +: 8], + INIT[659*9 +: 8], INIT[658*9 +: 8], INIT[657*9 +: 8], INIT[656*9 +: 8], + INIT[655*9 +: 8], INIT[654*9 +: 8], INIT[653*9 +: 8], INIT[652*9 +: 8], + INIT[651*9 +: 8], INIT[650*9 +: 8], INIT[649*9 +: 8], INIT[648*9 +: 8], + INIT[647*9 +: 8], INIT[646*9 +: 8], INIT[645*9 +: 8], INIT[644*9 +: 8], + INIT[643*9 +: 8], INIT[642*9 +: 8], INIT[641*9 +: 8], INIT[640*9 +: 8]}), +.INIT_15({INIT[703*9 +: 8], INIT[702*9 +: 8], INIT[701*9 +: 8], INIT[700*9 +: 8], + INIT[699*9 +: 8], INIT[698*9 +: 8], INIT[697*9 +: 8], INIT[696*9 +: 8], + INIT[695*9 +: 8], INIT[694*9 +: 8], INIT[693*9 +: 8], INIT[692*9 +: 8], + INIT[691*9 +: 8], INIT[690*9 +: 8], INIT[689*9 +: 8], INIT[688*9 +: 8], + INIT[687*9 +: 8], INIT[686*9 +: 8], INIT[685*9 +: 8], INIT[684*9 +: 8], + INIT[683*9 +: 8], INIT[682*9 +: 8], INIT[681*9 +: 8], INIT[680*9 +: 8], + INIT[679*9 +: 8], INIT[678*9 +: 8], INIT[677*9 +: 8], INIT[676*9 +: 8], + INIT[675*9 +: 8], INIT[674*9 +: 8], INIT[673*9 +: 8], INIT[672*9 +: 8]}), +.INIT_16({INIT[735*9 +: 8], INIT[734*9 +: 8], INIT[733*9 +: 8], INIT[732*9 +: 8], + INIT[731*9 +: 8], INIT[730*9 +: 8], INIT[729*9 +: 8], INIT[728*9 +: 8], + INIT[727*9 +: 8], INIT[726*9 +: 8], INIT[725*9 +: 8], INIT[724*9 +: 8], + INIT[723*9 +: 8], INIT[722*9 +: 8], INIT[721*9 +: 8], INIT[720*9 +: 8], + INIT[719*9 +: 8], INIT[718*9 +: 8], INIT[717*9 +: 8], INIT[716*9 +: 8], + INIT[715*9 +: 8], INIT[714*9 +: 8], INIT[713*9 +: 8], INIT[712*9 +: 8], + INIT[711*9 +: 8], INIT[710*9 +: 8], INIT[709*9 +: 8], INIT[708*9 +: 8], + INIT[707*9 +: 8], INIT[706*9 +: 8], INIT[705*9 +: 8], INIT[704*9 +: 8]}), +.INIT_17({INIT[767*9 +: 8], INIT[766*9 +: 8], INIT[765*9 +: 8], INIT[764*9 +: 8], + INIT[763*9 +: 8], INIT[762*9 +: 8], INIT[761*9 +: 8], INIT[760*9 +: 8], + INIT[759*9 +: 8], INIT[758*9 +: 8], INIT[757*9 +: 8], INIT[756*9 +: 8], + INIT[755*9 +: 8], INIT[754*9 +: 8], INIT[753*9 +: 8], INIT[752*9 +: 8], + INIT[751*9 +: 8], INIT[750*9 +: 8], INIT[749*9 +: 8], INIT[748*9 +: 8], + INIT[747*9 +: 8], INIT[746*9 +: 8], INIT[745*9 +: 8], INIT[744*9 +: 8], + INIT[743*9 +: 8], INIT[742*9 +: 8], INIT[741*9 +: 8], INIT[740*9 +: 8], + INIT[739*9 +: 8], INIT[738*9 +: 8], INIT[737*9 +: 8], INIT[736*9 +: 8]}), +.INIT_18({INIT[799*9 +: 8], INIT[798*9 +: 8], INIT[797*9 +: 8], INIT[796*9 +: 8], + INIT[795*9 +: 8], INIT[794*9 +: 8], INIT[793*9 +: 8], INIT[792*9 +: 8], + INIT[791*9 +: 8], INIT[790*9 +: 8], INIT[789*9 +: 8], INIT[788*9 +: 8], + INIT[787*9 +: 8], INIT[786*9 +: 8], INIT[785*9 +: 8], INIT[784*9 +: 8], + INIT[783*9 +: 8], INIT[782*9 +: 8], INIT[781*9 +: 8], INIT[780*9 +: 8], + INIT[779*9 +: 8], INIT[778*9 +: 8], INIT[777*9 +: 8], INIT[776*9 +: 8], + INIT[775*9 +: 8], INIT[774*9 +: 8], INIT[773*9 +: 8], INIT[772*9 +: 8], + INIT[771*9 +: 8], INIT[770*9 +: 8], INIT[769*9 +: 8], INIT[768*9 +: 8]}), +.INIT_19({INIT[831*9 +: 8], INIT[830*9 +: 8], INIT[829*9 +: 8], INIT[828*9 +: 8], + INIT[827*9 +: 8], INIT[826*9 +: 8], INIT[825*9 +: 8], INIT[824*9 +: 8], + INIT[823*9 +: 8], INIT[822*9 +: 8], INIT[821*9 +: 8], INIT[820*9 +: 8], + INIT[819*9 +: 8], INIT[818*9 +: 8], INIT[817*9 +: 8], INIT[816*9 +: 8], + INIT[815*9 +: 8], INIT[814*9 +: 8], INIT[813*9 +: 8], INIT[812*9 +: 8], + INIT[811*9 +: 8], INIT[810*9 +: 8], INIT[809*9 +: 8], INIT[808*9 +: 8], + INIT[807*9 +: 8], INIT[806*9 +: 8], INIT[805*9 +: 8], INIT[804*9 +: 8], + INIT[803*9 +: 8], INIT[802*9 +: 8], INIT[801*9 +: 8], INIT[800*9 +: 8]}), +.INIT_1A({INIT[863*9 +: 8], INIT[862*9 +: 8], INIT[861*9 +: 8], INIT[860*9 +: 8], + INIT[859*9 +: 8], INIT[858*9 +: 8], INIT[857*9 +: 8], INIT[856*9 +: 8], + INIT[855*9 +: 8], INIT[854*9 +: 8], INIT[853*9 +: 8], INIT[852*9 +: 8], + INIT[851*9 +: 8], INIT[850*9 +: 8], INIT[849*9 +: 8], INIT[848*9 +: 8], + INIT[847*9 +: 8], INIT[846*9 +: 8], INIT[845*9 +: 8], INIT[844*9 +: 8], + INIT[843*9 +: 8], INIT[842*9 +: 8], INIT[841*9 +: 8], INIT[840*9 +: 8], + INIT[839*9 +: 8], INIT[838*9 +: 8], INIT[837*9 +: 8], INIT[836*9 +: 8], + INIT[835*9 +: 8], INIT[834*9 +: 8], INIT[833*9 +: 8], INIT[832*9 +: 8]}), +.INIT_1B({INIT[895*9 +: 8], INIT[894*9 +: 8], INIT[893*9 +: 8], INIT[892*9 +: 8], + INIT[891*9 +: 8], INIT[890*9 +: 8], INIT[889*9 +: 8], INIT[888*9 +: 8], + INIT[887*9 +: 8], INIT[886*9 +: 8], INIT[885*9 +: 8], INIT[884*9 +: 8], + INIT[883*9 +: 8], INIT[882*9 +: 8], INIT[881*9 +: 8], INIT[880*9 +: 8], + INIT[879*9 +: 8], INIT[878*9 +: 8], INIT[877*9 +: 8], INIT[876*9 +: 8], + INIT[875*9 +: 8], INIT[874*9 +: 8], INIT[873*9 +: 8], INIT[872*9 +: 8], + INIT[871*9 +: 8], INIT[870*9 +: 8], INIT[869*9 +: 8], INIT[868*9 +: 8], + INIT[867*9 +: 8], INIT[866*9 +: 8], INIT[865*9 +: 8], INIT[864*9 +: 8]}), +.INIT_1C({INIT[927*9 +: 8], INIT[926*9 +: 8], INIT[925*9 +: 8], INIT[924*9 +: 8], + INIT[923*9 +: 8], INIT[922*9 +: 8], INIT[921*9 +: 8], INIT[920*9 +: 8], + INIT[919*9 +: 8], INIT[918*9 +: 8], INIT[917*9 +: 8], INIT[916*9 +: 8], + INIT[915*9 +: 8], INIT[914*9 +: 8], INIT[913*9 +: 8], INIT[912*9 +: 8], + INIT[911*9 +: 8], INIT[910*9 +: 8], INIT[909*9 +: 8], INIT[908*9 +: 8], + INIT[907*9 +: 8], INIT[906*9 +: 8], INIT[905*9 +: 8], INIT[904*9 +: 8], + INIT[903*9 +: 8], INIT[902*9 +: 8], INIT[901*9 +: 8], INIT[900*9 +: 8], + INIT[899*9 +: 8], INIT[898*9 +: 8], INIT[897*9 +: 8], INIT[896*9 +: 8]}), +.INIT_1D({INIT[959*9 +: 8], INIT[958*9 +: 8], INIT[957*9 +: 8], INIT[956*9 +: 8], + INIT[955*9 +: 8], INIT[954*9 +: 8], INIT[953*9 +: 8], INIT[952*9 +: 8], + INIT[951*9 +: 8], INIT[950*9 +: 8], INIT[949*9 +: 8], INIT[948*9 +: 8], + INIT[947*9 +: 8], INIT[946*9 +: 8], INIT[945*9 +: 8], INIT[944*9 +: 8], + INIT[943*9 +: 8], INIT[942*9 +: 8], INIT[941*9 +: 8], INIT[940*9 +: 8], + INIT[939*9 +: 8], INIT[938*9 +: 8], INIT[937*9 +: 8], INIT[936*9 +: 8], + INIT[935*9 +: 8], INIT[934*9 +: 8], INIT[933*9 +: 8], INIT[932*9 +: 8], + INIT[931*9 +: 8], INIT[930*9 +: 8], INIT[929*9 +: 8], INIT[928*9 +: 8]}), +.INIT_1E({INIT[991*9 +: 8], INIT[990*9 +: 8], INIT[989*9 +: 8], INIT[988*9 +: 8], + INIT[987*9 +: 8], INIT[986*9 +: 8], INIT[985*9 +: 8], INIT[984*9 +: 8], + INIT[983*9 +: 8], INIT[982*9 +: 8], INIT[981*9 +: 8], INIT[980*9 +: 8], + INIT[979*9 +: 8], INIT[978*9 +: 8], INIT[977*9 +: 8], INIT[976*9 +: 8], + INIT[975*9 +: 8], INIT[974*9 +: 8], INIT[973*9 +: 8], INIT[972*9 +: 8], + INIT[971*9 +: 8], INIT[970*9 +: 8], INIT[969*9 +: 8], INIT[968*9 +: 8], + INIT[967*9 +: 8], INIT[966*9 +: 8], INIT[965*9 +: 8], INIT[964*9 +: 8], + INIT[963*9 +: 8], INIT[962*9 +: 8], INIT[961*9 +: 8], INIT[960*9 +: 8]}), +.INIT_1F({INIT[1023*9 +: 8], INIT[1022*9 +: 8], INIT[1021*9 +: 8], INIT[1020*9 +: 8], + INIT[1019*9 +: 8], INIT[1018*9 +: 8], INIT[1017*9 +: 8], INIT[1016*9 +: 8], + INIT[1015*9 +: 8], INIT[1014*9 +: 8], INIT[1013*9 +: 8], INIT[1012*9 +: 8], + INIT[1011*9 +: 8], INIT[1010*9 +: 8], INIT[1009*9 +: 8], INIT[1008*9 +: 8], + INIT[1007*9 +: 8], INIT[1006*9 +: 8], INIT[1005*9 +: 8], INIT[1004*9 +: 8], + INIT[1003*9 +: 8], INIT[1002*9 +: 8], INIT[1001*9 +: 8], INIT[1000*9 +: 8], + INIT[999*9 +: 8], INIT[998*9 +: 8], INIT[997*9 +: 8], INIT[996*9 +: 8], + INIT[995*9 +: 8], INIT[994*9 +: 8], INIT[993*9 +: 8], INIT[992*9 +: 8]}), +.INIT_20({INIT[1055*9 +: 8], INIT[1054*9 +: 8], INIT[1053*9 +: 8], INIT[1052*9 +: 8], + INIT[1051*9 +: 8], INIT[1050*9 +: 8], INIT[1049*9 +: 8], INIT[1048*9 +: 8], + INIT[1047*9 +: 8], INIT[1046*9 +: 8], INIT[1045*9 +: 8], INIT[1044*9 +: 8], + INIT[1043*9 +: 8], INIT[1042*9 +: 8], INIT[1041*9 +: 8], INIT[1040*9 +: 8], + INIT[1039*9 +: 8], INIT[1038*9 +: 8], INIT[1037*9 +: 8], INIT[1036*9 +: 8], + INIT[1035*9 +: 8], INIT[1034*9 +: 8], INIT[1033*9 +: 8], INIT[1032*9 +: 8], + INIT[1031*9 +: 8], INIT[1030*9 +: 8], INIT[1029*9 +: 8], INIT[1028*9 +: 8], + INIT[1027*9 +: 8], INIT[1026*9 +: 8], INIT[1025*9 +: 8], INIT[1024*9 +: 8]}), +.INIT_21({INIT[1087*9 +: 8], INIT[1086*9 +: 8], INIT[1085*9 +: 8], INIT[1084*9 +: 8], + INIT[1083*9 +: 8], INIT[1082*9 +: 8], INIT[1081*9 +: 8], INIT[1080*9 +: 8], + INIT[1079*9 +: 8], INIT[1078*9 +: 8], INIT[1077*9 +: 8], INIT[1076*9 +: 8], + INIT[1075*9 +: 8], INIT[1074*9 +: 8], INIT[1073*9 +: 8], INIT[1072*9 +: 8], + INIT[1071*9 +: 8], INIT[1070*9 +: 8], INIT[1069*9 +: 8], INIT[1068*9 +: 8], + INIT[1067*9 +: 8], INIT[1066*9 +: 8], INIT[1065*9 +: 8], INIT[1064*9 +: 8], + INIT[1063*9 +: 8], INIT[1062*9 +: 8], INIT[1061*9 +: 8], INIT[1060*9 +: 8], + INIT[1059*9 +: 8], INIT[1058*9 +: 8], INIT[1057*9 +: 8], INIT[1056*9 +: 8]}), +.INIT_22({INIT[1119*9 +: 8], INIT[1118*9 +: 8], INIT[1117*9 +: 8], INIT[1116*9 +: 8], + INIT[1115*9 +: 8], INIT[1114*9 +: 8], INIT[1113*9 +: 8], INIT[1112*9 +: 8], + INIT[1111*9 +: 8], INIT[1110*9 +: 8], INIT[1109*9 +: 8], INIT[1108*9 +: 8], + INIT[1107*9 +: 8], INIT[1106*9 +: 8], INIT[1105*9 +: 8], INIT[1104*9 +: 8], + INIT[1103*9 +: 8], INIT[1102*9 +: 8], INIT[1101*9 +: 8], INIT[1100*9 +: 8], + INIT[1099*9 +: 8], INIT[1098*9 +: 8], INIT[1097*9 +: 8], INIT[1096*9 +: 8], + INIT[1095*9 +: 8], INIT[1094*9 +: 8], INIT[1093*9 +: 8], INIT[1092*9 +: 8], + INIT[1091*9 +: 8], INIT[1090*9 +: 8], INIT[1089*9 +: 8], INIT[1088*9 +: 8]}), +.INIT_23({INIT[1151*9 +: 8], INIT[1150*9 +: 8], INIT[1149*9 +: 8], INIT[1148*9 +: 8], + INIT[1147*9 +: 8], INIT[1146*9 +: 8], INIT[1145*9 +: 8], INIT[1144*9 +: 8], + INIT[1143*9 +: 8], INIT[1142*9 +: 8], INIT[1141*9 +: 8], INIT[1140*9 +: 8], + INIT[1139*9 +: 8], INIT[1138*9 +: 8], INIT[1137*9 +: 8], INIT[1136*9 +: 8], + INIT[1135*9 +: 8], INIT[1134*9 +: 8], INIT[1133*9 +: 8], INIT[1132*9 +: 8], + INIT[1131*9 +: 8], INIT[1130*9 +: 8], INIT[1129*9 +: 8], INIT[1128*9 +: 8], + INIT[1127*9 +: 8], INIT[1126*9 +: 8], INIT[1125*9 +: 8], INIT[1124*9 +: 8], + INIT[1123*9 +: 8], INIT[1122*9 +: 8], INIT[1121*9 +: 8], INIT[1120*9 +: 8]}), +.INIT_24({INIT[1183*9 +: 8], INIT[1182*9 +: 8], INIT[1181*9 +: 8], INIT[1180*9 +: 8], + INIT[1179*9 +: 8], INIT[1178*9 +: 8], INIT[1177*9 +: 8], INIT[1176*9 +: 8], + INIT[1175*9 +: 8], INIT[1174*9 +: 8], INIT[1173*9 +: 8], INIT[1172*9 +: 8], + INIT[1171*9 +: 8], INIT[1170*9 +: 8], INIT[1169*9 +: 8], INIT[1168*9 +: 8], + INIT[1167*9 +: 8], INIT[1166*9 +: 8], INIT[1165*9 +: 8], INIT[1164*9 +: 8], + INIT[1163*9 +: 8], INIT[1162*9 +: 8], INIT[1161*9 +: 8], INIT[1160*9 +: 8], + INIT[1159*9 +: 8], INIT[1158*9 +: 8], INIT[1157*9 +: 8], INIT[1156*9 +: 8], + INIT[1155*9 +: 8], INIT[1154*9 +: 8], INIT[1153*9 +: 8], INIT[1152*9 +: 8]}), +.INIT_25({INIT[1215*9 +: 8], INIT[1214*9 +: 8], INIT[1213*9 +: 8], INIT[1212*9 +: 8], + INIT[1211*9 +: 8], INIT[1210*9 +: 8], INIT[1209*9 +: 8], INIT[1208*9 +: 8], + INIT[1207*9 +: 8], INIT[1206*9 +: 8], INIT[1205*9 +: 8], INIT[1204*9 +: 8], + INIT[1203*9 +: 8], INIT[1202*9 +: 8], INIT[1201*9 +: 8], INIT[1200*9 +: 8], + INIT[1199*9 +: 8], INIT[1198*9 +: 8], INIT[1197*9 +: 8], INIT[1196*9 +: 8], + INIT[1195*9 +: 8], INIT[1194*9 +: 8], INIT[1193*9 +: 8], INIT[1192*9 +: 8], + INIT[1191*9 +: 8], INIT[1190*9 +: 8], INIT[1189*9 +: 8], INIT[1188*9 +: 8], + INIT[1187*9 +: 8], INIT[1186*9 +: 8], INIT[1185*9 +: 8], INIT[1184*9 +: 8]}), +.INIT_26({INIT[1247*9 +: 8], INIT[1246*9 +: 8], INIT[1245*9 +: 8], INIT[1244*9 +: 8], + INIT[1243*9 +: 8], INIT[1242*9 +: 8], INIT[1241*9 +: 8], INIT[1240*9 +: 8], + INIT[1239*9 +: 8], INIT[1238*9 +: 8], INIT[1237*9 +: 8], INIT[1236*9 +: 8], + INIT[1235*9 +: 8], INIT[1234*9 +: 8], INIT[1233*9 +: 8], INIT[1232*9 +: 8], + INIT[1231*9 +: 8], INIT[1230*9 +: 8], INIT[1229*9 +: 8], INIT[1228*9 +: 8], + INIT[1227*9 +: 8], INIT[1226*9 +: 8], INIT[1225*9 +: 8], INIT[1224*9 +: 8], + INIT[1223*9 +: 8], INIT[1222*9 +: 8], INIT[1221*9 +: 8], INIT[1220*9 +: 8], + INIT[1219*9 +: 8], INIT[1218*9 +: 8], INIT[1217*9 +: 8], INIT[1216*9 +: 8]}), +.INIT_27({INIT[1279*9 +: 8], INIT[1278*9 +: 8], INIT[1277*9 +: 8], INIT[1276*9 +: 8], + INIT[1275*9 +: 8], INIT[1274*9 +: 8], INIT[1273*9 +: 8], INIT[1272*9 +: 8], + INIT[1271*9 +: 8], INIT[1270*9 +: 8], INIT[1269*9 +: 8], INIT[1268*9 +: 8], + INIT[1267*9 +: 8], INIT[1266*9 +: 8], INIT[1265*9 +: 8], INIT[1264*9 +: 8], + INIT[1263*9 +: 8], INIT[1262*9 +: 8], INIT[1261*9 +: 8], INIT[1260*9 +: 8], + INIT[1259*9 +: 8], INIT[1258*9 +: 8], INIT[1257*9 +: 8], INIT[1256*9 +: 8], + INIT[1255*9 +: 8], INIT[1254*9 +: 8], INIT[1253*9 +: 8], INIT[1252*9 +: 8], + INIT[1251*9 +: 8], INIT[1250*9 +: 8], INIT[1249*9 +: 8], INIT[1248*9 +: 8]}), +.INIT_28({INIT[1311*9 +: 8], INIT[1310*9 +: 8], INIT[1309*9 +: 8], INIT[1308*9 +: 8], + INIT[1307*9 +: 8], INIT[1306*9 +: 8], INIT[1305*9 +: 8], INIT[1304*9 +: 8], + INIT[1303*9 +: 8], INIT[1302*9 +: 8], INIT[1301*9 +: 8], INIT[1300*9 +: 8], + INIT[1299*9 +: 8], INIT[1298*9 +: 8], INIT[1297*9 +: 8], INIT[1296*9 +: 8], + INIT[1295*9 +: 8], INIT[1294*9 +: 8], INIT[1293*9 +: 8], INIT[1292*9 +: 8], + INIT[1291*9 +: 8], INIT[1290*9 +: 8], INIT[1289*9 +: 8], INIT[1288*9 +: 8], + INIT[1287*9 +: 8], INIT[1286*9 +: 8], INIT[1285*9 +: 8], INIT[1284*9 +: 8], + INIT[1283*9 +: 8], INIT[1282*9 +: 8], INIT[1281*9 +: 8], INIT[1280*9 +: 8]}), +.INIT_29({INIT[1343*9 +: 8], INIT[1342*9 +: 8], INIT[1341*9 +: 8], INIT[1340*9 +: 8], + INIT[1339*9 +: 8], INIT[1338*9 +: 8], INIT[1337*9 +: 8], INIT[1336*9 +: 8], + INIT[1335*9 +: 8], INIT[1334*9 +: 8], INIT[1333*9 +: 8], INIT[1332*9 +: 8], + INIT[1331*9 +: 8], INIT[1330*9 +: 8], INIT[1329*9 +: 8], INIT[1328*9 +: 8], + INIT[1327*9 +: 8], INIT[1326*9 +: 8], INIT[1325*9 +: 8], INIT[1324*9 +: 8], + INIT[1323*9 +: 8], INIT[1322*9 +: 8], INIT[1321*9 +: 8], INIT[1320*9 +: 8], + INIT[1319*9 +: 8], INIT[1318*9 +: 8], INIT[1317*9 +: 8], INIT[1316*9 +: 8], + INIT[1315*9 +: 8], INIT[1314*9 +: 8], INIT[1313*9 +: 8], INIT[1312*9 +: 8]}), +.INIT_2A({INIT[1375*9 +: 8], INIT[1374*9 +: 8], INIT[1373*9 +: 8], INIT[1372*9 +: 8], + INIT[1371*9 +: 8], INIT[1370*9 +: 8], INIT[1369*9 +: 8], INIT[1368*9 +: 8], + INIT[1367*9 +: 8], INIT[1366*9 +: 8], INIT[1365*9 +: 8], INIT[1364*9 +: 8], + INIT[1363*9 +: 8], INIT[1362*9 +: 8], INIT[1361*9 +: 8], INIT[1360*9 +: 8], + INIT[1359*9 +: 8], INIT[1358*9 +: 8], INIT[1357*9 +: 8], INIT[1356*9 +: 8], + INIT[1355*9 +: 8], INIT[1354*9 +: 8], INIT[1353*9 +: 8], INIT[1352*9 +: 8], + INIT[1351*9 +: 8], INIT[1350*9 +: 8], INIT[1349*9 +: 8], INIT[1348*9 +: 8], + INIT[1347*9 +: 8], INIT[1346*9 +: 8], INIT[1345*9 +: 8], INIT[1344*9 +: 8]}), +.INIT_2B({INIT[1407*9 +: 8], INIT[1406*9 +: 8], INIT[1405*9 +: 8], INIT[1404*9 +: 8], + INIT[1403*9 +: 8], INIT[1402*9 +: 8], INIT[1401*9 +: 8], INIT[1400*9 +: 8], + INIT[1399*9 +: 8], INIT[1398*9 +: 8], INIT[1397*9 +: 8], INIT[1396*9 +: 8], + INIT[1395*9 +: 8], INIT[1394*9 +: 8], INIT[1393*9 +: 8], INIT[1392*9 +: 8], + INIT[1391*9 +: 8], INIT[1390*9 +: 8], INIT[1389*9 +: 8], INIT[1388*9 +: 8], + INIT[1387*9 +: 8], INIT[1386*9 +: 8], INIT[1385*9 +: 8], INIT[1384*9 +: 8], + INIT[1383*9 +: 8], INIT[1382*9 +: 8], INIT[1381*9 +: 8], INIT[1380*9 +: 8], + INIT[1379*9 +: 8], INIT[1378*9 +: 8], INIT[1377*9 +: 8], INIT[1376*9 +: 8]}), +.INIT_2C({INIT[1439*9 +: 8], INIT[1438*9 +: 8], INIT[1437*9 +: 8], INIT[1436*9 +: 8], + INIT[1435*9 +: 8], INIT[1434*9 +: 8], INIT[1433*9 +: 8], INIT[1432*9 +: 8], + INIT[1431*9 +: 8], INIT[1430*9 +: 8], INIT[1429*9 +: 8], INIT[1428*9 +: 8], + INIT[1427*9 +: 8], INIT[1426*9 +: 8], INIT[1425*9 +: 8], INIT[1424*9 +: 8], + INIT[1423*9 +: 8], INIT[1422*9 +: 8], INIT[1421*9 +: 8], INIT[1420*9 +: 8], + INIT[1419*9 +: 8], INIT[1418*9 +: 8], INIT[1417*9 +: 8], INIT[1416*9 +: 8], + INIT[1415*9 +: 8], INIT[1414*9 +: 8], INIT[1413*9 +: 8], INIT[1412*9 +: 8], + INIT[1411*9 +: 8], INIT[1410*9 +: 8], INIT[1409*9 +: 8], INIT[1408*9 +: 8]}), +.INIT_2D({INIT[1471*9 +: 8], INIT[1470*9 +: 8], INIT[1469*9 +: 8], INIT[1468*9 +: 8], + INIT[1467*9 +: 8], INIT[1466*9 +: 8], INIT[1465*9 +: 8], INIT[1464*9 +: 8], + INIT[1463*9 +: 8], INIT[1462*9 +: 8], INIT[1461*9 +: 8], INIT[1460*9 +: 8], + INIT[1459*9 +: 8], INIT[1458*9 +: 8], INIT[1457*9 +: 8], INIT[1456*9 +: 8], + INIT[1455*9 +: 8], INIT[1454*9 +: 8], INIT[1453*9 +: 8], INIT[1452*9 +: 8], + INIT[1451*9 +: 8], INIT[1450*9 +: 8], INIT[1449*9 +: 8], INIT[1448*9 +: 8], + INIT[1447*9 +: 8], INIT[1446*9 +: 8], INIT[1445*9 +: 8], INIT[1444*9 +: 8], + INIT[1443*9 +: 8], INIT[1442*9 +: 8], INIT[1441*9 +: 8], INIT[1440*9 +: 8]}), +.INIT_2E({INIT[1503*9 +: 8], INIT[1502*9 +: 8], INIT[1501*9 +: 8], INIT[1500*9 +: 8], + INIT[1499*9 +: 8], INIT[1498*9 +: 8], INIT[1497*9 +: 8], INIT[1496*9 +: 8], + INIT[1495*9 +: 8], INIT[1494*9 +: 8], INIT[1493*9 +: 8], INIT[1492*9 +: 8], + INIT[1491*9 +: 8], INIT[1490*9 +: 8], INIT[1489*9 +: 8], INIT[1488*9 +: 8], + INIT[1487*9 +: 8], INIT[1486*9 +: 8], INIT[1485*9 +: 8], INIT[1484*9 +: 8], + INIT[1483*9 +: 8], INIT[1482*9 +: 8], INIT[1481*9 +: 8], INIT[1480*9 +: 8], + INIT[1479*9 +: 8], INIT[1478*9 +: 8], INIT[1477*9 +: 8], INIT[1476*9 +: 8], + INIT[1475*9 +: 8], INIT[1474*9 +: 8], INIT[1473*9 +: 8], INIT[1472*9 +: 8]}), +.INIT_2F({INIT[1535*9 +: 8], INIT[1534*9 +: 8], INIT[1533*9 +: 8], INIT[1532*9 +: 8], + INIT[1531*9 +: 8], INIT[1530*9 +: 8], INIT[1529*9 +: 8], INIT[1528*9 +: 8], + INIT[1527*9 +: 8], INIT[1526*9 +: 8], INIT[1525*9 +: 8], INIT[1524*9 +: 8], + INIT[1523*9 +: 8], INIT[1522*9 +: 8], INIT[1521*9 +: 8], INIT[1520*9 +: 8], + INIT[1519*9 +: 8], INIT[1518*9 +: 8], INIT[1517*9 +: 8], INIT[1516*9 +: 8], + INIT[1515*9 +: 8], INIT[1514*9 +: 8], INIT[1513*9 +: 8], INIT[1512*9 +: 8], + INIT[1511*9 +: 8], INIT[1510*9 +: 8], INIT[1509*9 +: 8], INIT[1508*9 +: 8], + INIT[1507*9 +: 8], INIT[1506*9 +: 8], INIT[1505*9 +: 8], INIT[1504*9 +: 8]}), +.INIT_30({INIT[1567*9 +: 8], INIT[1566*9 +: 8], INIT[1565*9 +: 8], INIT[1564*9 +: 8], + INIT[1563*9 +: 8], INIT[1562*9 +: 8], INIT[1561*9 +: 8], INIT[1560*9 +: 8], + INIT[1559*9 +: 8], INIT[1558*9 +: 8], INIT[1557*9 +: 8], INIT[1556*9 +: 8], + INIT[1555*9 +: 8], INIT[1554*9 +: 8], INIT[1553*9 +: 8], INIT[1552*9 +: 8], + INIT[1551*9 +: 8], INIT[1550*9 +: 8], INIT[1549*9 +: 8], INIT[1548*9 +: 8], + INIT[1547*9 +: 8], INIT[1546*9 +: 8], INIT[1545*9 +: 8], INIT[1544*9 +: 8], + INIT[1543*9 +: 8], INIT[1542*9 +: 8], INIT[1541*9 +: 8], INIT[1540*9 +: 8], + INIT[1539*9 +: 8], INIT[1538*9 +: 8], INIT[1537*9 +: 8], INIT[1536*9 +: 8]}), +.INIT_31({INIT[1599*9 +: 8], INIT[1598*9 +: 8], INIT[1597*9 +: 8], INIT[1596*9 +: 8], + INIT[1595*9 +: 8], INIT[1594*9 +: 8], INIT[1593*9 +: 8], INIT[1592*9 +: 8], + INIT[1591*9 +: 8], INIT[1590*9 +: 8], INIT[1589*9 +: 8], INIT[1588*9 +: 8], + INIT[1587*9 +: 8], INIT[1586*9 +: 8], INIT[1585*9 +: 8], INIT[1584*9 +: 8], + INIT[1583*9 +: 8], INIT[1582*9 +: 8], INIT[1581*9 +: 8], INIT[1580*9 +: 8], + INIT[1579*9 +: 8], INIT[1578*9 +: 8], INIT[1577*9 +: 8], INIT[1576*9 +: 8], + INIT[1575*9 +: 8], INIT[1574*9 +: 8], INIT[1573*9 +: 8], INIT[1572*9 +: 8], + INIT[1571*9 +: 8], INIT[1570*9 +: 8], INIT[1569*9 +: 8], INIT[1568*9 +: 8]}), +.INIT_32({INIT[1631*9 +: 8], INIT[1630*9 +: 8], INIT[1629*9 +: 8], INIT[1628*9 +: 8], + INIT[1627*9 +: 8], INIT[1626*9 +: 8], INIT[1625*9 +: 8], INIT[1624*9 +: 8], + INIT[1623*9 +: 8], INIT[1622*9 +: 8], INIT[1621*9 +: 8], INIT[1620*9 +: 8], + INIT[1619*9 +: 8], INIT[1618*9 +: 8], INIT[1617*9 +: 8], INIT[1616*9 +: 8], + INIT[1615*9 +: 8], INIT[1614*9 +: 8], INIT[1613*9 +: 8], INIT[1612*9 +: 8], + INIT[1611*9 +: 8], INIT[1610*9 +: 8], INIT[1609*9 +: 8], INIT[1608*9 +: 8], + INIT[1607*9 +: 8], INIT[1606*9 +: 8], INIT[1605*9 +: 8], INIT[1604*9 +: 8], + INIT[1603*9 +: 8], INIT[1602*9 +: 8], INIT[1601*9 +: 8], INIT[1600*9 +: 8]}), +.INIT_33({INIT[1663*9 +: 8], INIT[1662*9 +: 8], INIT[1661*9 +: 8], INIT[1660*9 +: 8], + INIT[1659*9 +: 8], INIT[1658*9 +: 8], INIT[1657*9 +: 8], INIT[1656*9 +: 8], + INIT[1655*9 +: 8], INIT[1654*9 +: 8], INIT[1653*9 +: 8], INIT[1652*9 +: 8], + INIT[1651*9 +: 8], INIT[1650*9 +: 8], INIT[1649*9 +: 8], INIT[1648*9 +: 8], + INIT[1647*9 +: 8], INIT[1646*9 +: 8], INIT[1645*9 +: 8], INIT[1644*9 +: 8], + INIT[1643*9 +: 8], INIT[1642*9 +: 8], INIT[1641*9 +: 8], INIT[1640*9 +: 8], + INIT[1639*9 +: 8], INIT[1638*9 +: 8], INIT[1637*9 +: 8], INIT[1636*9 +: 8], + INIT[1635*9 +: 8], INIT[1634*9 +: 8], INIT[1633*9 +: 8], INIT[1632*9 +: 8]}), +.INIT_34({INIT[1695*9 +: 8], INIT[1694*9 +: 8], INIT[1693*9 +: 8], INIT[1692*9 +: 8], + INIT[1691*9 +: 8], INIT[1690*9 +: 8], INIT[1689*9 +: 8], INIT[1688*9 +: 8], + INIT[1687*9 +: 8], INIT[1686*9 +: 8], INIT[1685*9 +: 8], INIT[1684*9 +: 8], + INIT[1683*9 +: 8], INIT[1682*9 +: 8], INIT[1681*9 +: 8], INIT[1680*9 +: 8], + INIT[1679*9 +: 8], INIT[1678*9 +: 8], INIT[1677*9 +: 8], INIT[1676*9 +: 8], + INIT[1675*9 +: 8], INIT[1674*9 +: 8], INIT[1673*9 +: 8], INIT[1672*9 +: 8], + INIT[1671*9 +: 8], INIT[1670*9 +: 8], INIT[1669*9 +: 8], INIT[1668*9 +: 8], + INIT[1667*9 +: 8], INIT[1666*9 +: 8], INIT[1665*9 +: 8], INIT[1664*9 +: 8]}), +.INIT_35({INIT[1727*9 +: 8], INIT[1726*9 +: 8], INIT[1725*9 +: 8], INIT[1724*9 +: 8], + INIT[1723*9 +: 8], INIT[1722*9 +: 8], INIT[1721*9 +: 8], INIT[1720*9 +: 8], + INIT[1719*9 +: 8], INIT[1718*9 +: 8], INIT[1717*9 +: 8], INIT[1716*9 +: 8], + INIT[1715*9 +: 8], INIT[1714*9 +: 8], INIT[1713*9 +: 8], INIT[1712*9 +: 8], + INIT[1711*9 +: 8], INIT[1710*9 +: 8], INIT[1709*9 +: 8], INIT[1708*9 +: 8], + INIT[1707*9 +: 8], INIT[1706*9 +: 8], INIT[1705*9 +: 8], INIT[1704*9 +: 8], + INIT[1703*9 +: 8], INIT[1702*9 +: 8], INIT[1701*9 +: 8], INIT[1700*9 +: 8], + INIT[1699*9 +: 8], INIT[1698*9 +: 8], INIT[1697*9 +: 8], INIT[1696*9 +: 8]}), +.INIT_36({INIT[1759*9 +: 8], INIT[1758*9 +: 8], INIT[1757*9 +: 8], INIT[1756*9 +: 8], + INIT[1755*9 +: 8], INIT[1754*9 +: 8], INIT[1753*9 +: 8], INIT[1752*9 +: 8], + INIT[1751*9 +: 8], INIT[1750*9 +: 8], INIT[1749*9 +: 8], INIT[1748*9 +: 8], + INIT[1747*9 +: 8], INIT[1746*9 +: 8], INIT[1745*9 +: 8], INIT[1744*9 +: 8], + INIT[1743*9 +: 8], INIT[1742*9 +: 8], INIT[1741*9 +: 8], INIT[1740*9 +: 8], + INIT[1739*9 +: 8], INIT[1738*9 +: 8], INIT[1737*9 +: 8], INIT[1736*9 +: 8], + INIT[1735*9 +: 8], INIT[1734*9 +: 8], INIT[1733*9 +: 8], INIT[1732*9 +: 8], + INIT[1731*9 +: 8], INIT[1730*9 +: 8], INIT[1729*9 +: 8], INIT[1728*9 +: 8]}), +.INIT_37({INIT[1791*9 +: 8], INIT[1790*9 +: 8], INIT[1789*9 +: 8], INIT[1788*9 +: 8], + INIT[1787*9 +: 8], INIT[1786*9 +: 8], INIT[1785*9 +: 8], INIT[1784*9 +: 8], + INIT[1783*9 +: 8], INIT[1782*9 +: 8], INIT[1781*9 +: 8], INIT[1780*9 +: 8], + INIT[1779*9 +: 8], INIT[1778*9 +: 8], INIT[1777*9 +: 8], INIT[1776*9 +: 8], + INIT[1775*9 +: 8], INIT[1774*9 +: 8], INIT[1773*9 +: 8], INIT[1772*9 +: 8], + INIT[1771*9 +: 8], INIT[1770*9 +: 8], INIT[1769*9 +: 8], INIT[1768*9 +: 8], + INIT[1767*9 +: 8], INIT[1766*9 +: 8], INIT[1765*9 +: 8], INIT[1764*9 +: 8], + INIT[1763*9 +: 8], INIT[1762*9 +: 8], INIT[1761*9 +: 8], INIT[1760*9 +: 8]}), +.INIT_38({INIT[1823*9 +: 8], INIT[1822*9 +: 8], INIT[1821*9 +: 8], INIT[1820*9 +: 8], + INIT[1819*9 +: 8], INIT[1818*9 +: 8], INIT[1817*9 +: 8], INIT[1816*9 +: 8], + INIT[1815*9 +: 8], INIT[1814*9 +: 8], INIT[1813*9 +: 8], INIT[1812*9 +: 8], + INIT[1811*9 +: 8], INIT[1810*9 +: 8], INIT[1809*9 +: 8], INIT[1808*9 +: 8], + INIT[1807*9 +: 8], INIT[1806*9 +: 8], INIT[1805*9 +: 8], INIT[1804*9 +: 8], + INIT[1803*9 +: 8], INIT[1802*9 +: 8], INIT[1801*9 +: 8], INIT[1800*9 +: 8], + INIT[1799*9 +: 8], INIT[1798*9 +: 8], INIT[1797*9 +: 8], INIT[1796*9 +: 8], + INIT[1795*9 +: 8], INIT[1794*9 +: 8], INIT[1793*9 +: 8], INIT[1792*9 +: 8]}), +.INIT_39({INIT[1855*9 +: 8], INIT[1854*9 +: 8], INIT[1853*9 +: 8], INIT[1852*9 +: 8], + INIT[1851*9 +: 8], INIT[1850*9 +: 8], INIT[1849*9 +: 8], INIT[1848*9 +: 8], + INIT[1847*9 +: 8], INIT[1846*9 +: 8], INIT[1845*9 +: 8], INIT[1844*9 +: 8], + INIT[1843*9 +: 8], INIT[1842*9 +: 8], INIT[1841*9 +: 8], INIT[1840*9 +: 8], + INIT[1839*9 +: 8], INIT[1838*9 +: 8], INIT[1837*9 +: 8], INIT[1836*9 +: 8], + INIT[1835*9 +: 8], INIT[1834*9 +: 8], INIT[1833*9 +: 8], INIT[1832*9 +: 8], + INIT[1831*9 +: 8], INIT[1830*9 +: 8], INIT[1829*9 +: 8], INIT[1828*9 +: 8], + INIT[1827*9 +: 8], INIT[1826*9 +: 8], INIT[1825*9 +: 8], INIT[1824*9 +: 8]}), +.INIT_3A({INIT[1887*9 +: 8], INIT[1886*9 +: 8], INIT[1885*9 +: 8], INIT[1884*9 +: 8], + INIT[1883*9 +: 8], INIT[1882*9 +: 8], INIT[1881*9 +: 8], INIT[1880*9 +: 8], + INIT[1879*9 +: 8], INIT[1878*9 +: 8], INIT[1877*9 +: 8], INIT[1876*9 +: 8], + INIT[1875*9 +: 8], INIT[1874*9 +: 8], INIT[1873*9 +: 8], INIT[1872*9 +: 8], + INIT[1871*9 +: 8], INIT[1870*9 +: 8], INIT[1869*9 +: 8], INIT[1868*9 +: 8], + INIT[1867*9 +: 8], INIT[1866*9 +: 8], INIT[1865*9 +: 8], INIT[1864*9 +: 8], + INIT[1863*9 +: 8], INIT[1862*9 +: 8], INIT[1861*9 +: 8], INIT[1860*9 +: 8], + INIT[1859*9 +: 8], INIT[1858*9 +: 8], INIT[1857*9 +: 8], INIT[1856*9 +: 8]}), +.INIT_3B({INIT[1919*9 +: 8], INIT[1918*9 +: 8], INIT[1917*9 +: 8], INIT[1916*9 +: 8], + INIT[1915*9 +: 8], INIT[1914*9 +: 8], INIT[1913*9 +: 8], INIT[1912*9 +: 8], + INIT[1911*9 +: 8], INIT[1910*9 +: 8], INIT[1909*9 +: 8], INIT[1908*9 +: 8], + INIT[1907*9 +: 8], INIT[1906*9 +: 8], INIT[1905*9 +: 8], INIT[1904*9 +: 8], + INIT[1903*9 +: 8], INIT[1902*9 +: 8], INIT[1901*9 +: 8], INIT[1900*9 +: 8], + INIT[1899*9 +: 8], INIT[1898*9 +: 8], INIT[1897*9 +: 8], INIT[1896*9 +: 8], + INIT[1895*9 +: 8], INIT[1894*9 +: 8], INIT[1893*9 +: 8], INIT[1892*9 +: 8], + INIT[1891*9 +: 8], INIT[1890*9 +: 8], INIT[1889*9 +: 8], INIT[1888*9 +: 8]}), +.INIT_3C({INIT[1951*9 +: 8], INIT[1950*9 +: 8], INIT[1949*9 +: 8], INIT[1948*9 +: 8], + INIT[1947*9 +: 8], INIT[1946*9 +: 8], INIT[1945*9 +: 8], INIT[1944*9 +: 8], + INIT[1943*9 +: 8], INIT[1942*9 +: 8], INIT[1941*9 +: 8], INIT[1940*9 +: 8], + INIT[1939*9 +: 8], INIT[1938*9 +: 8], INIT[1937*9 +: 8], INIT[1936*9 +: 8], + INIT[1935*9 +: 8], INIT[1934*9 +: 8], INIT[1933*9 +: 8], INIT[1932*9 +: 8], + INIT[1931*9 +: 8], INIT[1930*9 +: 8], INIT[1929*9 +: 8], INIT[1928*9 +: 8], + INIT[1927*9 +: 8], INIT[1926*9 +: 8], INIT[1925*9 +: 8], INIT[1924*9 +: 8], + INIT[1923*9 +: 8], INIT[1922*9 +: 8], INIT[1921*9 +: 8], INIT[1920*9 +: 8]}), +.INIT_3D({INIT[1983*9 +: 8], INIT[1982*9 +: 8], INIT[1981*9 +: 8], INIT[1980*9 +: 8], + INIT[1979*9 +: 8], INIT[1978*9 +: 8], INIT[1977*9 +: 8], INIT[1976*9 +: 8], + INIT[1975*9 +: 8], INIT[1974*9 +: 8], INIT[1973*9 +: 8], INIT[1972*9 +: 8], + INIT[1971*9 +: 8], INIT[1970*9 +: 8], INIT[1969*9 +: 8], INIT[1968*9 +: 8], + INIT[1967*9 +: 8], INIT[1966*9 +: 8], INIT[1965*9 +: 8], INIT[1964*9 +: 8], + INIT[1963*9 +: 8], INIT[1962*9 +: 8], INIT[1961*9 +: 8], INIT[1960*9 +: 8], + INIT[1959*9 +: 8], INIT[1958*9 +: 8], INIT[1957*9 +: 8], INIT[1956*9 +: 8], + INIT[1955*9 +: 8], INIT[1954*9 +: 8], INIT[1953*9 +: 8], INIT[1952*9 +: 8]}), +.INIT_3E({INIT[2015*9 +: 8], INIT[2014*9 +: 8], INIT[2013*9 +: 8], INIT[2012*9 +: 8], + INIT[2011*9 +: 8], INIT[2010*9 +: 8], INIT[2009*9 +: 8], INIT[2008*9 +: 8], + INIT[2007*9 +: 8], INIT[2006*9 +: 8], INIT[2005*9 +: 8], INIT[2004*9 +: 8], + INIT[2003*9 +: 8], INIT[2002*9 +: 8], INIT[2001*9 +: 8], INIT[2000*9 +: 8], + INIT[1999*9 +: 8], INIT[1998*9 +: 8], INIT[1997*9 +: 8], INIT[1996*9 +: 8], + INIT[1995*9 +: 8], INIT[1994*9 +: 8], INIT[1993*9 +: 8], INIT[1992*9 +: 8], + INIT[1991*9 +: 8], INIT[1990*9 +: 8], INIT[1989*9 +: 8], INIT[1988*9 +: 8], + INIT[1987*9 +: 8], INIT[1986*9 +: 8], INIT[1985*9 +: 8], INIT[1984*9 +: 8]}), +.INIT_3F({INIT[2047*9 +: 8], INIT[2046*9 +: 8], INIT[2045*9 +: 8], INIT[2044*9 +: 8], + INIT[2043*9 +: 8], INIT[2042*9 +: 8], INIT[2041*9 +: 8], INIT[2040*9 +: 8], + INIT[2039*9 +: 8], INIT[2038*9 +: 8], INIT[2037*9 +: 8], INIT[2036*9 +: 8], + INIT[2035*9 +: 8], INIT[2034*9 +: 8], INIT[2033*9 +: 8], INIT[2032*9 +: 8], + INIT[2031*9 +: 8], INIT[2030*9 +: 8], INIT[2029*9 +: 8], INIT[2028*9 +: 8], + INIT[2027*9 +: 8], INIT[2026*9 +: 8], INIT[2025*9 +: 8], INIT[2024*9 +: 8], + INIT[2023*9 +: 8], INIT[2022*9 +: 8], INIT[2021*9 +: 8], INIT[2020*9 +: 8], + INIT[2019*9 +: 8], INIT[2018*9 +: 8], INIT[2017*9 +: 8], INIT[2016*9 +: 8]}), diff --git a/verilog/windows/autoyosys/share/xilinx/brams_init_32.vh b/verilog/windows/autoyosys/share/xilinx/brams_init_32.vh new file mode 100644 index 0000000..de91602 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/brams_init_32.vh @@ -0,0 +1,128 @@ +.INIT_00(INIT[ 0*256 +: 256]), +.INIT_01(INIT[ 1*256 +: 256]), +.INIT_02(INIT[ 2*256 +: 256]), +.INIT_03(INIT[ 3*256 +: 256]), +.INIT_04(INIT[ 4*256 +: 256]), +.INIT_05(INIT[ 5*256 +: 256]), +.INIT_06(INIT[ 6*256 +: 256]), +.INIT_07(INIT[ 7*256 +: 256]), +.INIT_08(INIT[ 8*256 +: 256]), +.INIT_09(INIT[ 9*256 +: 256]), +.INIT_0A(INIT[ 10*256 +: 256]), +.INIT_0B(INIT[ 11*256 +: 256]), +.INIT_0C(INIT[ 12*256 +: 256]), +.INIT_0D(INIT[ 13*256 +: 256]), +.INIT_0E(INIT[ 14*256 +: 256]), +.INIT_0F(INIT[ 15*256 +: 256]), +.INIT_10(INIT[ 16*256 +: 256]), +.INIT_11(INIT[ 17*256 +: 256]), +.INIT_12(INIT[ 18*256 +: 256]), +.INIT_13(INIT[ 19*256 +: 256]), +.INIT_14(INIT[ 20*256 +: 256]), +.INIT_15(INIT[ 21*256 +: 256]), +.INIT_16(INIT[ 22*256 +: 256]), +.INIT_17(INIT[ 23*256 +: 256]), +.INIT_18(INIT[ 24*256 +: 256]), +.INIT_19(INIT[ 25*256 +: 256]), +.INIT_1A(INIT[ 26*256 +: 256]), +.INIT_1B(INIT[ 27*256 +: 256]), +.INIT_1C(INIT[ 28*256 +: 256]), +.INIT_1D(INIT[ 29*256 +: 256]), +.INIT_1E(INIT[ 30*256 +: 256]), +.INIT_1F(INIT[ 31*256 +: 256]), +.INIT_20(INIT[ 32*256 +: 256]), +.INIT_21(INIT[ 33*256 +: 256]), +.INIT_22(INIT[ 34*256 +: 256]), +.INIT_23(INIT[ 35*256 +: 256]), +.INIT_24(INIT[ 36*256 +: 256]), +.INIT_25(INIT[ 37*256 +: 256]), +.INIT_26(INIT[ 38*256 +: 256]), +.INIT_27(INIT[ 39*256 +: 256]), +.INIT_28(INIT[ 40*256 +: 256]), +.INIT_29(INIT[ 41*256 +: 256]), +.INIT_2A(INIT[ 42*256 +: 256]), +.INIT_2B(INIT[ 43*256 +: 256]), +.INIT_2C(INIT[ 44*256 +: 256]), +.INIT_2D(INIT[ 45*256 +: 256]), +.INIT_2E(INIT[ 46*256 +: 256]), +.INIT_2F(INIT[ 47*256 +: 256]), +.INIT_30(INIT[ 48*256 +: 256]), +.INIT_31(INIT[ 49*256 +: 256]), +.INIT_32(INIT[ 50*256 +: 256]), +.INIT_33(INIT[ 51*256 +: 256]), +.INIT_34(INIT[ 52*256 +: 256]), +.INIT_35(INIT[ 53*256 +: 256]), +.INIT_36(INIT[ 54*256 +: 256]), +.INIT_37(INIT[ 55*256 +: 256]), +.INIT_38(INIT[ 56*256 +: 256]), +.INIT_39(INIT[ 57*256 +: 256]), +.INIT_3A(INIT[ 58*256 +: 256]), +.INIT_3B(INIT[ 59*256 +: 256]), +.INIT_3C(INIT[ 60*256 +: 256]), +.INIT_3D(INIT[ 61*256 +: 256]), +.INIT_3E(INIT[ 62*256 +: 256]), +.INIT_3F(INIT[ 63*256 +: 256]), +.INIT_40(INIT[ 64*256 +: 256]), +.INIT_41(INIT[ 65*256 +: 256]), +.INIT_42(INIT[ 66*256 +: 256]), +.INIT_43(INIT[ 67*256 +: 256]), +.INIT_44(INIT[ 68*256 +: 256]), +.INIT_45(INIT[ 69*256 +: 256]), +.INIT_46(INIT[ 70*256 +: 256]), +.INIT_47(INIT[ 71*256 +: 256]), +.INIT_48(INIT[ 72*256 +: 256]), +.INIT_49(INIT[ 73*256 +: 256]), +.INIT_4A(INIT[ 74*256 +: 256]), +.INIT_4B(INIT[ 75*256 +: 256]), +.INIT_4C(INIT[ 76*256 +: 256]), +.INIT_4D(INIT[ 77*256 +: 256]), +.INIT_4E(INIT[ 78*256 +: 256]), +.INIT_4F(INIT[ 79*256 +: 256]), +.INIT_50(INIT[ 80*256 +: 256]), +.INIT_51(INIT[ 81*256 +: 256]), +.INIT_52(INIT[ 82*256 +: 256]), +.INIT_53(INIT[ 83*256 +: 256]), +.INIT_54(INIT[ 84*256 +: 256]), +.INIT_55(INIT[ 85*256 +: 256]), +.INIT_56(INIT[ 86*256 +: 256]), +.INIT_57(INIT[ 87*256 +: 256]), +.INIT_58(INIT[ 88*256 +: 256]), +.INIT_59(INIT[ 89*256 +: 256]), +.INIT_5A(INIT[ 90*256 +: 256]), +.INIT_5B(INIT[ 91*256 +: 256]), +.INIT_5C(INIT[ 92*256 +: 256]), +.INIT_5D(INIT[ 93*256 +: 256]), +.INIT_5E(INIT[ 94*256 +: 256]), +.INIT_5F(INIT[ 95*256 +: 256]), +.INIT_60(INIT[ 96*256 +: 256]), +.INIT_61(INIT[ 97*256 +: 256]), +.INIT_62(INIT[ 98*256 +: 256]), +.INIT_63(INIT[ 99*256 +: 256]), +.INIT_64(INIT[100*256 +: 256]), +.INIT_65(INIT[101*256 +: 256]), +.INIT_66(INIT[102*256 +: 256]), +.INIT_67(INIT[103*256 +: 256]), +.INIT_68(INIT[104*256 +: 256]), +.INIT_69(INIT[105*256 +: 256]), +.INIT_6A(INIT[106*256 +: 256]), +.INIT_6B(INIT[107*256 +: 256]), +.INIT_6C(INIT[108*256 +: 256]), +.INIT_6D(INIT[109*256 +: 256]), +.INIT_6E(INIT[110*256 +: 256]), +.INIT_6F(INIT[111*256 +: 256]), +.INIT_70(INIT[112*256 +: 256]), +.INIT_71(INIT[113*256 +: 256]), +.INIT_72(INIT[114*256 +: 256]), +.INIT_73(INIT[115*256 +: 256]), +.INIT_74(INIT[116*256 +: 256]), +.INIT_75(INIT[117*256 +: 256]), +.INIT_76(INIT[118*256 +: 256]), +.INIT_77(INIT[119*256 +: 256]), +.INIT_78(INIT[120*256 +: 256]), +.INIT_79(INIT[121*256 +: 256]), +.INIT_7A(INIT[122*256 +: 256]), +.INIT_7B(INIT[123*256 +: 256]), +.INIT_7C(INIT[124*256 +: 256]), +.INIT_7D(INIT[125*256 +: 256]), +.INIT_7E(INIT[126*256 +: 256]), +.INIT_7F(INIT[127*256 +: 256]), diff --git a/verilog/windows/autoyosys/share/xilinx/brams_init_36.vh b/verilog/windows/autoyosys/share/xilinx/brams_init_36.vh new file mode 100644 index 0000000..4684b39 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/brams_init_36.vh @@ -0,0 +1,2048 @@ +.INITP_00({INIT[255*9+8], INIT[254*9+8], INIT[253*9+8], INIT[252*9+8], + INIT[251*9+8], INIT[250*9+8], INIT[249*9+8], INIT[248*9+8], + INIT[247*9+8], INIT[246*9+8], INIT[245*9+8], INIT[244*9+8], + INIT[243*9+8], INIT[242*9+8], INIT[241*9+8], INIT[240*9+8], + INIT[239*9+8], INIT[238*9+8], INIT[237*9+8], INIT[236*9+8], + INIT[235*9+8], INIT[234*9+8], INIT[233*9+8], INIT[232*9+8], + INIT[231*9+8], INIT[230*9+8], INIT[229*9+8], INIT[228*9+8], + INIT[227*9+8], INIT[226*9+8], INIT[225*9+8], INIT[224*9+8], + INIT[223*9+8], INIT[222*9+8], INIT[221*9+8], INIT[220*9+8], + INIT[219*9+8], INIT[218*9+8], INIT[217*9+8], INIT[216*9+8], + INIT[215*9+8], INIT[214*9+8], INIT[213*9+8], INIT[212*9+8], + INIT[211*9+8], INIT[210*9+8], INIT[209*9+8], INIT[208*9+8], + INIT[207*9+8], INIT[206*9+8], INIT[205*9+8], INIT[204*9+8], + INIT[203*9+8], INIT[202*9+8], INIT[201*9+8], INIT[200*9+8], + INIT[199*9+8], INIT[198*9+8], INIT[197*9+8], INIT[196*9+8], + INIT[195*9+8], INIT[194*9+8], INIT[193*9+8], INIT[192*9+8], + INIT[191*9+8], INIT[190*9+8], INIT[189*9+8], INIT[188*9+8], + INIT[187*9+8], INIT[186*9+8], INIT[185*9+8], INIT[184*9+8], + INIT[183*9+8], INIT[182*9+8], INIT[181*9+8], INIT[180*9+8], + INIT[179*9+8], INIT[178*9+8], INIT[177*9+8], INIT[176*9+8], + INIT[175*9+8], INIT[174*9+8], INIT[173*9+8], INIT[172*9+8], + INIT[171*9+8], INIT[170*9+8], INIT[169*9+8], INIT[168*9+8], + INIT[167*9+8], INIT[166*9+8], INIT[165*9+8], INIT[164*9+8], + INIT[163*9+8], INIT[162*9+8], INIT[161*9+8], INIT[160*9+8], + INIT[159*9+8], INIT[158*9+8], INIT[157*9+8], INIT[156*9+8], + INIT[155*9+8], INIT[154*9+8], INIT[153*9+8], INIT[152*9+8], + INIT[151*9+8], INIT[150*9+8], INIT[149*9+8], INIT[148*9+8], + INIT[147*9+8], INIT[146*9+8], INIT[145*9+8], INIT[144*9+8], + INIT[143*9+8], INIT[142*9+8], INIT[141*9+8], INIT[140*9+8], + INIT[139*9+8], INIT[138*9+8], INIT[137*9+8], INIT[136*9+8], + INIT[135*9+8], INIT[134*9+8], INIT[133*9+8], INIT[132*9+8], + INIT[131*9+8], INIT[130*9+8], INIT[129*9+8], INIT[128*9+8], + INIT[127*9+8], INIT[126*9+8], INIT[125*9+8], INIT[124*9+8], + INIT[123*9+8], INIT[122*9+8], INIT[121*9+8], INIT[120*9+8], + INIT[119*9+8], INIT[118*9+8], INIT[117*9+8], INIT[116*9+8], + INIT[115*9+8], INIT[114*9+8], INIT[113*9+8], INIT[112*9+8], + INIT[111*9+8], INIT[110*9+8], INIT[109*9+8], INIT[108*9+8], + INIT[107*9+8], INIT[106*9+8], INIT[105*9+8], INIT[104*9+8], + INIT[103*9+8], INIT[102*9+8], INIT[101*9+8], INIT[100*9+8], + INIT[ 99*9+8], INIT[ 98*9+8], INIT[ 97*9+8], INIT[ 96*9+8], + INIT[ 95*9+8], INIT[ 94*9+8], INIT[ 93*9+8], INIT[ 92*9+8], + INIT[ 91*9+8], INIT[ 90*9+8], INIT[ 89*9+8], INIT[ 88*9+8], + INIT[ 87*9+8], INIT[ 86*9+8], INIT[ 85*9+8], INIT[ 84*9+8], + INIT[ 83*9+8], INIT[ 82*9+8], INIT[ 81*9+8], INIT[ 80*9+8], + INIT[ 79*9+8], INIT[ 78*9+8], INIT[ 77*9+8], INIT[ 76*9+8], + INIT[ 75*9+8], INIT[ 74*9+8], INIT[ 73*9+8], INIT[ 72*9+8], + INIT[ 71*9+8], INIT[ 70*9+8], INIT[ 69*9+8], INIT[ 68*9+8], + INIT[ 67*9+8], INIT[ 66*9+8], INIT[ 65*9+8], INIT[ 64*9+8], + INIT[ 63*9+8], INIT[ 62*9+8], INIT[ 61*9+8], INIT[ 60*9+8], + INIT[ 59*9+8], INIT[ 58*9+8], INIT[ 57*9+8], INIT[ 56*9+8], + INIT[ 55*9+8], INIT[ 54*9+8], INIT[ 53*9+8], INIT[ 52*9+8], + INIT[ 51*9+8], INIT[ 50*9+8], INIT[ 49*9+8], INIT[ 48*9+8], + INIT[ 47*9+8], INIT[ 46*9+8], INIT[ 45*9+8], INIT[ 44*9+8], + INIT[ 43*9+8], INIT[ 42*9+8], INIT[ 41*9+8], INIT[ 40*9+8], + INIT[ 39*9+8], INIT[ 38*9+8], INIT[ 37*9+8], INIT[ 36*9+8], + INIT[ 35*9+8], INIT[ 34*9+8], INIT[ 33*9+8], INIT[ 32*9+8], + INIT[ 31*9+8], INIT[ 30*9+8], INIT[ 29*9+8], INIT[ 28*9+8], + INIT[ 27*9+8], INIT[ 26*9+8], INIT[ 25*9+8], INIT[ 24*9+8], + INIT[ 23*9+8], INIT[ 22*9+8], INIT[ 21*9+8], INIT[ 20*9+8], + INIT[ 19*9+8], INIT[ 18*9+8], INIT[ 17*9+8], INIT[ 16*9+8], + INIT[ 15*9+8], INIT[ 14*9+8], INIT[ 13*9+8], INIT[ 12*9+8], + INIT[ 11*9+8], INIT[ 10*9+8], INIT[ 9*9+8], INIT[ 8*9+8], + INIT[ 7*9+8], INIT[ 6*9+8], INIT[ 5*9+8], INIT[ 4*9+8], + INIT[ 3*9+8], INIT[ 2*9+8], INIT[ 1*9+8], INIT[ 0*9+8]}), +.INITP_01({INIT[511*9+8], INIT[510*9+8], INIT[509*9+8], INIT[508*9+8], + INIT[507*9+8], INIT[506*9+8], INIT[505*9+8], INIT[504*9+8], + INIT[503*9+8], INIT[502*9+8], INIT[501*9+8], INIT[500*9+8], + INIT[499*9+8], INIT[498*9+8], INIT[497*9+8], INIT[496*9+8], + INIT[495*9+8], INIT[494*9+8], INIT[493*9+8], INIT[492*9+8], + INIT[491*9+8], INIT[490*9+8], INIT[489*9+8], INIT[488*9+8], + INIT[487*9+8], INIT[486*9+8], INIT[485*9+8], INIT[484*9+8], + INIT[483*9+8], INIT[482*9+8], INIT[481*9+8], INIT[480*9+8], + INIT[479*9+8], INIT[478*9+8], INIT[477*9+8], INIT[476*9+8], + INIT[475*9+8], INIT[474*9+8], INIT[473*9+8], INIT[472*9+8], + INIT[471*9+8], INIT[470*9+8], INIT[469*9+8], INIT[468*9+8], + INIT[467*9+8], INIT[466*9+8], INIT[465*9+8], INIT[464*9+8], + INIT[463*9+8], INIT[462*9+8], INIT[461*9+8], INIT[460*9+8], + INIT[459*9+8], INIT[458*9+8], INIT[457*9+8], INIT[456*9+8], + INIT[455*9+8], INIT[454*9+8], INIT[453*9+8], INIT[452*9+8], + INIT[451*9+8], INIT[450*9+8], INIT[449*9+8], INIT[448*9+8], + INIT[447*9+8], INIT[446*9+8], INIT[445*9+8], INIT[444*9+8], + INIT[443*9+8], INIT[442*9+8], INIT[441*9+8], INIT[440*9+8], + INIT[439*9+8], INIT[438*9+8], INIT[437*9+8], INIT[436*9+8], + INIT[435*9+8], INIT[434*9+8], INIT[433*9+8], INIT[432*9+8], + INIT[431*9+8], INIT[430*9+8], INIT[429*9+8], INIT[428*9+8], + INIT[427*9+8], INIT[426*9+8], INIT[425*9+8], INIT[424*9+8], + INIT[423*9+8], INIT[422*9+8], INIT[421*9+8], INIT[420*9+8], + INIT[419*9+8], INIT[418*9+8], INIT[417*9+8], INIT[416*9+8], + INIT[415*9+8], INIT[414*9+8], INIT[413*9+8], INIT[412*9+8], + INIT[411*9+8], INIT[410*9+8], INIT[409*9+8], INIT[408*9+8], + INIT[407*9+8], INIT[406*9+8], INIT[405*9+8], INIT[404*9+8], + INIT[403*9+8], INIT[402*9+8], INIT[401*9+8], INIT[400*9+8], + INIT[399*9+8], INIT[398*9+8], INIT[397*9+8], INIT[396*9+8], + INIT[395*9+8], INIT[394*9+8], INIT[393*9+8], INIT[392*9+8], + INIT[391*9+8], INIT[390*9+8], INIT[389*9+8], INIT[388*9+8], + INIT[387*9+8], INIT[386*9+8], INIT[385*9+8], INIT[384*9+8], + INIT[383*9+8], INIT[382*9+8], INIT[381*9+8], INIT[380*9+8], + INIT[379*9+8], INIT[378*9+8], INIT[377*9+8], INIT[376*9+8], + INIT[375*9+8], INIT[374*9+8], INIT[373*9+8], INIT[372*9+8], + INIT[371*9+8], INIT[370*9+8], INIT[369*9+8], INIT[368*9+8], + INIT[367*9+8], INIT[366*9+8], INIT[365*9+8], INIT[364*9+8], + INIT[363*9+8], INIT[362*9+8], INIT[361*9+8], INIT[360*9+8], + INIT[359*9+8], INIT[358*9+8], INIT[357*9+8], INIT[356*9+8], + INIT[355*9+8], INIT[354*9+8], INIT[353*9+8], INIT[352*9+8], + INIT[351*9+8], INIT[350*9+8], INIT[349*9+8], INIT[348*9+8], + INIT[347*9+8], INIT[346*9+8], INIT[345*9+8], INIT[344*9+8], + INIT[343*9+8], INIT[342*9+8], INIT[341*9+8], INIT[340*9+8], + INIT[339*9+8], INIT[338*9+8], INIT[337*9+8], INIT[336*9+8], + INIT[335*9+8], INIT[334*9+8], INIT[333*9+8], INIT[332*9+8], + INIT[331*9+8], INIT[330*9+8], INIT[329*9+8], INIT[328*9+8], + INIT[327*9+8], INIT[326*9+8], INIT[325*9+8], INIT[324*9+8], + INIT[323*9+8], INIT[322*9+8], INIT[321*9+8], INIT[320*9+8], + INIT[319*9+8], INIT[318*9+8], INIT[317*9+8], INIT[316*9+8], + INIT[315*9+8], INIT[314*9+8], INIT[313*9+8], INIT[312*9+8], + INIT[311*9+8], INIT[310*9+8], INIT[309*9+8], INIT[308*9+8], + INIT[307*9+8], INIT[306*9+8], INIT[305*9+8], INIT[304*9+8], + INIT[303*9+8], INIT[302*9+8], INIT[301*9+8], INIT[300*9+8], + INIT[299*9+8], INIT[298*9+8], INIT[297*9+8], INIT[296*9+8], + INIT[295*9+8], INIT[294*9+8], INIT[293*9+8], INIT[292*9+8], + INIT[291*9+8], INIT[290*9+8], INIT[289*9+8], INIT[288*9+8], + INIT[287*9+8], INIT[286*9+8], INIT[285*9+8], INIT[284*9+8], + INIT[283*9+8], INIT[282*9+8], INIT[281*9+8], INIT[280*9+8], + INIT[279*9+8], INIT[278*9+8], INIT[277*9+8], INIT[276*9+8], + INIT[275*9+8], INIT[274*9+8], INIT[273*9+8], INIT[272*9+8], + INIT[271*9+8], INIT[270*9+8], INIT[269*9+8], INIT[268*9+8], + INIT[267*9+8], INIT[266*9+8], INIT[265*9+8], INIT[264*9+8], + INIT[263*9+8], INIT[262*9+8], INIT[261*9+8], INIT[260*9+8], + INIT[259*9+8], INIT[258*9+8], INIT[257*9+8], INIT[256*9+8]}), +.INITP_02({INIT[767*9+8], INIT[766*9+8], INIT[765*9+8], INIT[764*9+8], + INIT[763*9+8], INIT[762*9+8], INIT[761*9+8], INIT[760*9+8], + INIT[759*9+8], INIT[758*9+8], INIT[757*9+8], INIT[756*9+8], + INIT[755*9+8], INIT[754*9+8], INIT[753*9+8], INIT[752*9+8], + INIT[751*9+8], INIT[750*9+8], INIT[749*9+8], INIT[748*9+8], + INIT[747*9+8], INIT[746*9+8], INIT[745*9+8], INIT[744*9+8], + INIT[743*9+8], INIT[742*9+8], INIT[741*9+8], INIT[740*9+8], + INIT[739*9+8], INIT[738*9+8], INIT[737*9+8], INIT[736*9+8], + INIT[735*9+8], INIT[734*9+8], INIT[733*9+8], INIT[732*9+8], + INIT[731*9+8], INIT[730*9+8], INIT[729*9+8], INIT[728*9+8], + INIT[727*9+8], INIT[726*9+8], INIT[725*9+8], INIT[724*9+8], + INIT[723*9+8], INIT[722*9+8], INIT[721*9+8], INIT[720*9+8], + INIT[719*9+8], INIT[718*9+8], INIT[717*9+8], INIT[716*9+8], + INIT[715*9+8], INIT[714*9+8], INIT[713*9+8], INIT[712*9+8], + INIT[711*9+8], INIT[710*9+8], INIT[709*9+8], INIT[708*9+8], + INIT[707*9+8], INIT[706*9+8], INIT[705*9+8], INIT[704*9+8], + INIT[703*9+8], INIT[702*9+8], INIT[701*9+8], INIT[700*9+8], + INIT[699*9+8], INIT[698*9+8], INIT[697*9+8], INIT[696*9+8], + INIT[695*9+8], INIT[694*9+8], INIT[693*9+8], INIT[692*9+8], + INIT[691*9+8], INIT[690*9+8], INIT[689*9+8], INIT[688*9+8], + INIT[687*9+8], INIT[686*9+8], INIT[685*9+8], INIT[684*9+8], + INIT[683*9+8], INIT[682*9+8], INIT[681*9+8], INIT[680*9+8], + INIT[679*9+8], INIT[678*9+8], INIT[677*9+8], INIT[676*9+8], + INIT[675*9+8], INIT[674*9+8], INIT[673*9+8], INIT[672*9+8], + INIT[671*9+8], INIT[670*9+8], INIT[669*9+8], INIT[668*9+8], + INIT[667*9+8], INIT[666*9+8], INIT[665*9+8], INIT[664*9+8], + INIT[663*9+8], INIT[662*9+8], INIT[661*9+8], INIT[660*9+8], + INIT[659*9+8], INIT[658*9+8], INIT[657*9+8], INIT[656*9+8], + INIT[655*9+8], INIT[654*9+8], INIT[653*9+8], INIT[652*9+8], + INIT[651*9+8], INIT[650*9+8], INIT[649*9+8], INIT[648*9+8], + INIT[647*9+8], INIT[646*9+8], INIT[645*9+8], INIT[644*9+8], + INIT[643*9+8], INIT[642*9+8], INIT[641*9+8], INIT[640*9+8], + INIT[639*9+8], INIT[638*9+8], INIT[637*9+8], INIT[636*9+8], + INIT[635*9+8], INIT[634*9+8], INIT[633*9+8], INIT[632*9+8], + INIT[631*9+8], INIT[630*9+8], INIT[629*9+8], INIT[628*9+8], + INIT[627*9+8], INIT[626*9+8], INIT[625*9+8], INIT[624*9+8], + INIT[623*9+8], INIT[622*9+8], INIT[621*9+8], INIT[620*9+8], + INIT[619*9+8], INIT[618*9+8], INIT[617*9+8], INIT[616*9+8], + INIT[615*9+8], INIT[614*9+8], INIT[613*9+8], INIT[612*9+8], + INIT[611*9+8], INIT[610*9+8], INIT[609*9+8], INIT[608*9+8], + INIT[607*9+8], INIT[606*9+8], INIT[605*9+8], INIT[604*9+8], + INIT[603*9+8], INIT[602*9+8], INIT[601*9+8], INIT[600*9+8], + INIT[599*9+8], INIT[598*9+8], INIT[597*9+8], INIT[596*9+8], + INIT[595*9+8], INIT[594*9+8], INIT[593*9+8], INIT[592*9+8], + INIT[591*9+8], INIT[590*9+8], INIT[589*9+8], INIT[588*9+8], + INIT[587*9+8], INIT[586*9+8], INIT[585*9+8], INIT[584*9+8], + INIT[583*9+8], INIT[582*9+8], INIT[581*9+8], INIT[580*9+8], + INIT[579*9+8], INIT[578*9+8], INIT[577*9+8], INIT[576*9+8], + INIT[575*9+8], INIT[574*9+8], INIT[573*9+8], INIT[572*9+8], + INIT[571*9+8], INIT[570*9+8], INIT[569*9+8], INIT[568*9+8], + INIT[567*9+8], INIT[566*9+8], INIT[565*9+8], INIT[564*9+8], + INIT[563*9+8], INIT[562*9+8], INIT[561*9+8], INIT[560*9+8], + INIT[559*9+8], INIT[558*9+8], INIT[557*9+8], INIT[556*9+8], + INIT[555*9+8], INIT[554*9+8], INIT[553*9+8], INIT[552*9+8], + INIT[551*9+8], INIT[550*9+8], INIT[549*9+8], INIT[548*9+8], + INIT[547*9+8], INIT[546*9+8], INIT[545*9+8], INIT[544*9+8], + INIT[543*9+8], INIT[542*9+8], INIT[541*9+8], INIT[540*9+8], + INIT[539*9+8], INIT[538*9+8], INIT[537*9+8], INIT[536*9+8], + INIT[535*9+8], INIT[534*9+8], INIT[533*9+8], INIT[532*9+8], + INIT[531*9+8], INIT[530*9+8], INIT[529*9+8], INIT[528*9+8], + INIT[527*9+8], INIT[526*9+8], INIT[525*9+8], INIT[524*9+8], + INIT[523*9+8], INIT[522*9+8], INIT[521*9+8], INIT[520*9+8], + INIT[519*9+8], INIT[518*9+8], INIT[517*9+8], INIT[516*9+8], + INIT[515*9+8], INIT[514*9+8], INIT[513*9+8], INIT[512*9+8]}), +.INITP_03({INIT[1023*9+8], INIT[1022*9+8], INIT[1021*9+8], INIT[1020*9+8], + INIT[1019*9+8], INIT[1018*9+8], INIT[1017*9+8], INIT[1016*9+8], + INIT[1015*9+8], INIT[1014*9+8], INIT[1013*9+8], INIT[1012*9+8], + INIT[1011*9+8], INIT[1010*9+8], INIT[1009*9+8], INIT[1008*9+8], + INIT[1007*9+8], INIT[1006*9+8], INIT[1005*9+8], INIT[1004*9+8], + INIT[1003*9+8], INIT[1002*9+8], INIT[1001*9+8], INIT[1000*9+8], + INIT[999*9+8], INIT[998*9+8], INIT[997*9+8], INIT[996*9+8], + INIT[995*9+8], INIT[994*9+8], INIT[993*9+8], INIT[992*9+8], + INIT[991*9+8], INIT[990*9+8], INIT[989*9+8], INIT[988*9+8], + INIT[987*9+8], INIT[986*9+8], INIT[985*9+8], INIT[984*9+8], + INIT[983*9+8], INIT[982*9+8], INIT[981*9+8], INIT[980*9+8], + INIT[979*9+8], INIT[978*9+8], INIT[977*9+8], INIT[976*9+8], + INIT[975*9+8], INIT[974*9+8], INIT[973*9+8], INIT[972*9+8], + INIT[971*9+8], INIT[970*9+8], INIT[969*9+8], INIT[968*9+8], + INIT[967*9+8], INIT[966*9+8], INIT[965*9+8], INIT[964*9+8], + INIT[963*9+8], INIT[962*9+8], INIT[961*9+8], INIT[960*9+8], + INIT[959*9+8], INIT[958*9+8], INIT[957*9+8], INIT[956*9+8], + INIT[955*9+8], INIT[954*9+8], INIT[953*9+8], INIT[952*9+8], + INIT[951*9+8], INIT[950*9+8], INIT[949*9+8], INIT[948*9+8], + INIT[947*9+8], INIT[946*9+8], INIT[945*9+8], INIT[944*9+8], + INIT[943*9+8], INIT[942*9+8], INIT[941*9+8], INIT[940*9+8], + INIT[939*9+8], INIT[938*9+8], INIT[937*9+8], INIT[936*9+8], + INIT[935*9+8], INIT[934*9+8], INIT[933*9+8], INIT[932*9+8], + INIT[931*9+8], INIT[930*9+8], INIT[929*9+8], INIT[928*9+8], + INIT[927*9+8], INIT[926*9+8], INIT[925*9+8], INIT[924*9+8], + INIT[923*9+8], INIT[922*9+8], INIT[921*9+8], INIT[920*9+8], + INIT[919*9+8], INIT[918*9+8], INIT[917*9+8], INIT[916*9+8], + INIT[915*9+8], INIT[914*9+8], INIT[913*9+8], INIT[912*9+8], + INIT[911*9+8], INIT[910*9+8], INIT[909*9+8], INIT[908*9+8], + INIT[907*9+8], INIT[906*9+8], INIT[905*9+8], INIT[904*9+8], + INIT[903*9+8], INIT[902*9+8], INIT[901*9+8], INIT[900*9+8], + INIT[899*9+8], INIT[898*9+8], INIT[897*9+8], INIT[896*9+8], + INIT[895*9+8], INIT[894*9+8], INIT[893*9+8], INIT[892*9+8], + INIT[891*9+8], INIT[890*9+8], INIT[889*9+8], INIT[888*9+8], + INIT[887*9+8], INIT[886*9+8], INIT[885*9+8], INIT[884*9+8], + INIT[883*9+8], INIT[882*9+8], INIT[881*9+8], INIT[880*9+8], + INIT[879*9+8], INIT[878*9+8], INIT[877*9+8], INIT[876*9+8], + INIT[875*9+8], INIT[874*9+8], INIT[873*9+8], INIT[872*9+8], + INIT[871*9+8], INIT[870*9+8], INIT[869*9+8], INIT[868*9+8], + INIT[867*9+8], INIT[866*9+8], INIT[865*9+8], INIT[864*9+8], + INIT[863*9+8], INIT[862*9+8], INIT[861*9+8], INIT[860*9+8], + INIT[859*9+8], INIT[858*9+8], INIT[857*9+8], INIT[856*9+8], + INIT[855*9+8], INIT[854*9+8], INIT[853*9+8], INIT[852*9+8], + INIT[851*9+8], INIT[850*9+8], INIT[849*9+8], INIT[848*9+8], + INIT[847*9+8], INIT[846*9+8], INIT[845*9+8], INIT[844*9+8], + INIT[843*9+8], INIT[842*9+8], INIT[841*9+8], INIT[840*9+8], + INIT[839*9+8], INIT[838*9+8], INIT[837*9+8], INIT[836*9+8], + INIT[835*9+8], INIT[834*9+8], INIT[833*9+8], INIT[832*9+8], + INIT[831*9+8], INIT[830*9+8], INIT[829*9+8], INIT[828*9+8], + INIT[827*9+8], INIT[826*9+8], INIT[825*9+8], INIT[824*9+8], + INIT[823*9+8], INIT[822*9+8], INIT[821*9+8], INIT[820*9+8], + INIT[819*9+8], INIT[818*9+8], INIT[817*9+8], INIT[816*9+8], + INIT[815*9+8], INIT[814*9+8], INIT[813*9+8], INIT[812*9+8], + INIT[811*9+8], INIT[810*9+8], INIT[809*9+8], INIT[808*9+8], + INIT[807*9+8], INIT[806*9+8], INIT[805*9+8], INIT[804*9+8], + INIT[803*9+8], INIT[802*9+8], INIT[801*9+8], INIT[800*9+8], + INIT[799*9+8], INIT[798*9+8], INIT[797*9+8], INIT[796*9+8], + INIT[795*9+8], INIT[794*9+8], INIT[793*9+8], INIT[792*9+8], + INIT[791*9+8], INIT[790*9+8], INIT[789*9+8], INIT[788*9+8], + INIT[787*9+8], INIT[786*9+8], INIT[785*9+8], INIT[784*9+8], + INIT[783*9+8], INIT[782*9+8], INIT[781*9+8], INIT[780*9+8], + INIT[779*9+8], INIT[778*9+8], INIT[777*9+8], INIT[776*9+8], + INIT[775*9+8], INIT[774*9+8], INIT[773*9+8], INIT[772*9+8], + INIT[771*9+8], INIT[770*9+8], INIT[769*9+8], INIT[768*9+8]}), +.INITP_04({INIT[1279*9+8], INIT[1278*9+8], INIT[1277*9+8], INIT[1276*9+8], + INIT[1275*9+8], INIT[1274*9+8], INIT[1273*9+8], INIT[1272*9+8], + INIT[1271*9+8], INIT[1270*9+8], INIT[1269*9+8], INIT[1268*9+8], + INIT[1267*9+8], INIT[1266*9+8], INIT[1265*9+8], INIT[1264*9+8], + INIT[1263*9+8], INIT[1262*9+8], INIT[1261*9+8], INIT[1260*9+8], + INIT[1259*9+8], INIT[1258*9+8], INIT[1257*9+8], INIT[1256*9+8], + INIT[1255*9+8], INIT[1254*9+8], INIT[1253*9+8], INIT[1252*9+8], + INIT[1251*9+8], INIT[1250*9+8], INIT[1249*9+8], INIT[1248*9+8], + INIT[1247*9+8], INIT[1246*9+8], INIT[1245*9+8], INIT[1244*9+8], + INIT[1243*9+8], INIT[1242*9+8], INIT[1241*9+8], INIT[1240*9+8], + INIT[1239*9+8], INIT[1238*9+8], INIT[1237*9+8], INIT[1236*9+8], + INIT[1235*9+8], INIT[1234*9+8], INIT[1233*9+8], INIT[1232*9+8], + INIT[1231*9+8], INIT[1230*9+8], INIT[1229*9+8], INIT[1228*9+8], + INIT[1227*9+8], INIT[1226*9+8], INIT[1225*9+8], INIT[1224*9+8], + INIT[1223*9+8], INIT[1222*9+8], INIT[1221*9+8], INIT[1220*9+8], + INIT[1219*9+8], INIT[1218*9+8], INIT[1217*9+8], INIT[1216*9+8], + INIT[1215*9+8], INIT[1214*9+8], INIT[1213*9+8], INIT[1212*9+8], + INIT[1211*9+8], INIT[1210*9+8], INIT[1209*9+8], INIT[1208*9+8], + INIT[1207*9+8], INIT[1206*9+8], INIT[1205*9+8], INIT[1204*9+8], + INIT[1203*9+8], INIT[1202*9+8], INIT[1201*9+8], INIT[1200*9+8], + INIT[1199*9+8], INIT[1198*9+8], INIT[1197*9+8], INIT[1196*9+8], + INIT[1195*9+8], INIT[1194*9+8], INIT[1193*9+8], INIT[1192*9+8], + INIT[1191*9+8], INIT[1190*9+8], INIT[1189*9+8], INIT[1188*9+8], + INIT[1187*9+8], INIT[1186*9+8], INIT[1185*9+8], INIT[1184*9+8], + INIT[1183*9+8], INIT[1182*9+8], INIT[1181*9+8], INIT[1180*9+8], + INIT[1179*9+8], INIT[1178*9+8], INIT[1177*9+8], INIT[1176*9+8], + INIT[1175*9+8], INIT[1174*9+8], INIT[1173*9+8], INIT[1172*9+8], + INIT[1171*9+8], INIT[1170*9+8], INIT[1169*9+8], INIT[1168*9+8], + INIT[1167*9+8], INIT[1166*9+8], INIT[1165*9+8], INIT[1164*9+8], + INIT[1163*9+8], INIT[1162*9+8], INIT[1161*9+8], INIT[1160*9+8], + INIT[1159*9+8], INIT[1158*9+8], INIT[1157*9+8], INIT[1156*9+8], + INIT[1155*9+8], INIT[1154*9+8], INIT[1153*9+8], INIT[1152*9+8], + INIT[1151*9+8], INIT[1150*9+8], INIT[1149*9+8], INIT[1148*9+8], + INIT[1147*9+8], INIT[1146*9+8], INIT[1145*9+8], INIT[1144*9+8], + INIT[1143*9+8], INIT[1142*9+8], INIT[1141*9+8], INIT[1140*9+8], + INIT[1139*9+8], INIT[1138*9+8], INIT[1137*9+8], INIT[1136*9+8], + INIT[1135*9+8], INIT[1134*9+8], INIT[1133*9+8], INIT[1132*9+8], + INIT[1131*9+8], INIT[1130*9+8], INIT[1129*9+8], INIT[1128*9+8], + INIT[1127*9+8], INIT[1126*9+8], INIT[1125*9+8], INIT[1124*9+8], + INIT[1123*9+8], INIT[1122*9+8], INIT[1121*9+8], INIT[1120*9+8], + INIT[1119*9+8], INIT[1118*9+8], INIT[1117*9+8], INIT[1116*9+8], + INIT[1115*9+8], INIT[1114*9+8], INIT[1113*9+8], INIT[1112*9+8], + INIT[1111*9+8], INIT[1110*9+8], INIT[1109*9+8], INIT[1108*9+8], + INIT[1107*9+8], INIT[1106*9+8], INIT[1105*9+8], INIT[1104*9+8], + INIT[1103*9+8], INIT[1102*9+8], INIT[1101*9+8], INIT[1100*9+8], + INIT[1099*9+8], INIT[1098*9+8], INIT[1097*9+8], INIT[1096*9+8], + INIT[1095*9+8], INIT[1094*9+8], INIT[1093*9+8], INIT[1092*9+8], + INIT[1091*9+8], INIT[1090*9+8], INIT[1089*9+8], INIT[1088*9+8], + INIT[1087*9+8], INIT[1086*9+8], INIT[1085*9+8], INIT[1084*9+8], + INIT[1083*9+8], INIT[1082*9+8], INIT[1081*9+8], INIT[1080*9+8], + INIT[1079*9+8], INIT[1078*9+8], INIT[1077*9+8], INIT[1076*9+8], + INIT[1075*9+8], INIT[1074*9+8], INIT[1073*9+8], INIT[1072*9+8], + INIT[1071*9+8], INIT[1070*9+8], INIT[1069*9+8], INIT[1068*9+8], + INIT[1067*9+8], INIT[1066*9+8], INIT[1065*9+8], INIT[1064*9+8], + INIT[1063*9+8], INIT[1062*9+8], INIT[1061*9+8], INIT[1060*9+8], + INIT[1059*9+8], INIT[1058*9+8], INIT[1057*9+8], INIT[1056*9+8], + INIT[1055*9+8], INIT[1054*9+8], INIT[1053*9+8], INIT[1052*9+8], + INIT[1051*9+8], INIT[1050*9+8], INIT[1049*9+8], INIT[1048*9+8], + INIT[1047*9+8], INIT[1046*9+8], INIT[1045*9+8], INIT[1044*9+8], + INIT[1043*9+8], INIT[1042*9+8], INIT[1041*9+8], INIT[1040*9+8], + INIT[1039*9+8], INIT[1038*9+8], INIT[1037*9+8], INIT[1036*9+8], + INIT[1035*9+8], INIT[1034*9+8], INIT[1033*9+8], INIT[1032*9+8], + INIT[1031*9+8], INIT[1030*9+8], INIT[1029*9+8], INIT[1028*9+8], + INIT[1027*9+8], INIT[1026*9+8], INIT[1025*9+8], INIT[1024*9+8]}), +.INITP_05({INIT[1535*9+8], INIT[1534*9+8], INIT[1533*9+8], INIT[1532*9+8], + INIT[1531*9+8], INIT[1530*9+8], INIT[1529*9+8], INIT[1528*9+8], + INIT[1527*9+8], INIT[1526*9+8], INIT[1525*9+8], INIT[1524*9+8], + INIT[1523*9+8], INIT[1522*9+8], INIT[1521*9+8], INIT[1520*9+8], + INIT[1519*9+8], INIT[1518*9+8], INIT[1517*9+8], INIT[1516*9+8], + INIT[1515*9+8], INIT[1514*9+8], INIT[1513*9+8], INIT[1512*9+8], + INIT[1511*9+8], INIT[1510*9+8], INIT[1509*9+8], INIT[1508*9+8], + INIT[1507*9+8], INIT[1506*9+8], INIT[1505*9+8], INIT[1504*9+8], + INIT[1503*9+8], INIT[1502*9+8], INIT[1501*9+8], INIT[1500*9+8], + INIT[1499*9+8], INIT[1498*9+8], INIT[1497*9+8], INIT[1496*9+8], + INIT[1495*9+8], INIT[1494*9+8], INIT[1493*9+8], INIT[1492*9+8], + INIT[1491*9+8], INIT[1490*9+8], INIT[1489*9+8], INIT[1488*9+8], + INIT[1487*9+8], INIT[1486*9+8], INIT[1485*9+8], INIT[1484*9+8], + INIT[1483*9+8], INIT[1482*9+8], INIT[1481*9+8], INIT[1480*9+8], + INIT[1479*9+8], INIT[1478*9+8], INIT[1477*9+8], INIT[1476*9+8], + INIT[1475*9+8], INIT[1474*9+8], INIT[1473*9+8], INIT[1472*9+8], + INIT[1471*9+8], INIT[1470*9+8], INIT[1469*9+8], INIT[1468*9+8], + INIT[1467*9+8], INIT[1466*9+8], INIT[1465*9+8], INIT[1464*9+8], + INIT[1463*9+8], INIT[1462*9+8], INIT[1461*9+8], INIT[1460*9+8], + INIT[1459*9+8], INIT[1458*9+8], INIT[1457*9+8], INIT[1456*9+8], + INIT[1455*9+8], INIT[1454*9+8], INIT[1453*9+8], INIT[1452*9+8], + INIT[1451*9+8], INIT[1450*9+8], INIT[1449*9+8], INIT[1448*9+8], + INIT[1447*9+8], INIT[1446*9+8], INIT[1445*9+8], INIT[1444*9+8], + INIT[1443*9+8], INIT[1442*9+8], INIT[1441*9+8], INIT[1440*9+8], + INIT[1439*9+8], INIT[1438*9+8], INIT[1437*9+8], INIT[1436*9+8], + INIT[1435*9+8], INIT[1434*9+8], INIT[1433*9+8], INIT[1432*9+8], + INIT[1431*9+8], INIT[1430*9+8], INIT[1429*9+8], INIT[1428*9+8], + INIT[1427*9+8], INIT[1426*9+8], INIT[1425*9+8], INIT[1424*9+8], + INIT[1423*9+8], INIT[1422*9+8], INIT[1421*9+8], INIT[1420*9+8], + INIT[1419*9+8], INIT[1418*9+8], INIT[1417*9+8], INIT[1416*9+8], + INIT[1415*9+8], INIT[1414*9+8], INIT[1413*9+8], INIT[1412*9+8], + INIT[1411*9+8], INIT[1410*9+8], INIT[1409*9+8], INIT[1408*9+8], + INIT[1407*9+8], INIT[1406*9+8], INIT[1405*9+8], INIT[1404*9+8], + INIT[1403*9+8], INIT[1402*9+8], INIT[1401*9+8], INIT[1400*9+8], + INIT[1399*9+8], INIT[1398*9+8], INIT[1397*9+8], INIT[1396*9+8], + INIT[1395*9+8], INIT[1394*9+8], INIT[1393*9+8], INIT[1392*9+8], + INIT[1391*9+8], INIT[1390*9+8], INIT[1389*9+8], INIT[1388*9+8], + INIT[1387*9+8], INIT[1386*9+8], INIT[1385*9+8], INIT[1384*9+8], + INIT[1383*9+8], INIT[1382*9+8], INIT[1381*9+8], INIT[1380*9+8], + INIT[1379*9+8], INIT[1378*9+8], INIT[1377*9+8], INIT[1376*9+8], + INIT[1375*9+8], INIT[1374*9+8], INIT[1373*9+8], INIT[1372*9+8], + INIT[1371*9+8], INIT[1370*9+8], INIT[1369*9+8], INIT[1368*9+8], + INIT[1367*9+8], INIT[1366*9+8], INIT[1365*9+8], INIT[1364*9+8], + INIT[1363*9+8], INIT[1362*9+8], INIT[1361*9+8], INIT[1360*9+8], + INIT[1359*9+8], INIT[1358*9+8], INIT[1357*9+8], INIT[1356*9+8], + INIT[1355*9+8], INIT[1354*9+8], INIT[1353*9+8], INIT[1352*9+8], + INIT[1351*9+8], INIT[1350*9+8], INIT[1349*9+8], INIT[1348*9+8], + INIT[1347*9+8], INIT[1346*9+8], INIT[1345*9+8], INIT[1344*9+8], + INIT[1343*9+8], INIT[1342*9+8], INIT[1341*9+8], INIT[1340*9+8], + INIT[1339*9+8], INIT[1338*9+8], INIT[1337*9+8], INIT[1336*9+8], + INIT[1335*9+8], INIT[1334*9+8], INIT[1333*9+8], INIT[1332*9+8], + INIT[1331*9+8], INIT[1330*9+8], INIT[1329*9+8], INIT[1328*9+8], + INIT[1327*9+8], INIT[1326*9+8], INIT[1325*9+8], INIT[1324*9+8], + INIT[1323*9+8], INIT[1322*9+8], INIT[1321*9+8], INIT[1320*9+8], + INIT[1319*9+8], INIT[1318*9+8], INIT[1317*9+8], INIT[1316*9+8], + INIT[1315*9+8], INIT[1314*9+8], INIT[1313*9+8], INIT[1312*9+8], + INIT[1311*9+8], INIT[1310*9+8], INIT[1309*9+8], INIT[1308*9+8], + INIT[1307*9+8], INIT[1306*9+8], INIT[1305*9+8], INIT[1304*9+8], + INIT[1303*9+8], INIT[1302*9+8], INIT[1301*9+8], INIT[1300*9+8], + INIT[1299*9+8], INIT[1298*9+8], INIT[1297*9+8], INIT[1296*9+8], + INIT[1295*9+8], INIT[1294*9+8], INIT[1293*9+8], INIT[1292*9+8], + INIT[1291*9+8], INIT[1290*9+8], INIT[1289*9+8], INIT[1288*9+8], + INIT[1287*9+8], INIT[1286*9+8], INIT[1285*9+8], INIT[1284*9+8], + INIT[1283*9+8], INIT[1282*9+8], INIT[1281*9+8], INIT[1280*9+8]}), +.INITP_06({INIT[1791*9+8], INIT[1790*9+8], INIT[1789*9+8], INIT[1788*9+8], + INIT[1787*9+8], INIT[1786*9+8], INIT[1785*9+8], INIT[1784*9+8], + INIT[1783*9+8], INIT[1782*9+8], INIT[1781*9+8], INIT[1780*9+8], + INIT[1779*9+8], INIT[1778*9+8], INIT[1777*9+8], INIT[1776*9+8], + INIT[1775*9+8], INIT[1774*9+8], INIT[1773*9+8], INIT[1772*9+8], + INIT[1771*9+8], INIT[1770*9+8], INIT[1769*9+8], INIT[1768*9+8], + INIT[1767*9+8], INIT[1766*9+8], INIT[1765*9+8], INIT[1764*9+8], + INIT[1763*9+8], INIT[1762*9+8], INIT[1761*9+8], INIT[1760*9+8], + INIT[1759*9+8], INIT[1758*9+8], INIT[1757*9+8], INIT[1756*9+8], + INIT[1755*9+8], INIT[1754*9+8], INIT[1753*9+8], INIT[1752*9+8], + INIT[1751*9+8], INIT[1750*9+8], INIT[1749*9+8], INIT[1748*9+8], + INIT[1747*9+8], INIT[1746*9+8], INIT[1745*9+8], INIT[1744*9+8], + INIT[1743*9+8], INIT[1742*9+8], INIT[1741*9+8], INIT[1740*9+8], + INIT[1739*9+8], INIT[1738*9+8], INIT[1737*9+8], INIT[1736*9+8], + INIT[1735*9+8], INIT[1734*9+8], INIT[1733*9+8], INIT[1732*9+8], + INIT[1731*9+8], INIT[1730*9+8], INIT[1729*9+8], INIT[1728*9+8], + INIT[1727*9+8], INIT[1726*9+8], INIT[1725*9+8], INIT[1724*9+8], + INIT[1723*9+8], INIT[1722*9+8], INIT[1721*9+8], INIT[1720*9+8], + INIT[1719*9+8], INIT[1718*9+8], INIT[1717*9+8], INIT[1716*9+8], + INIT[1715*9+8], INIT[1714*9+8], INIT[1713*9+8], INIT[1712*9+8], + INIT[1711*9+8], INIT[1710*9+8], INIT[1709*9+8], INIT[1708*9+8], + INIT[1707*9+8], INIT[1706*9+8], INIT[1705*9+8], INIT[1704*9+8], + INIT[1703*9+8], INIT[1702*9+8], INIT[1701*9+8], INIT[1700*9+8], + INIT[1699*9+8], INIT[1698*9+8], INIT[1697*9+8], INIT[1696*9+8], + INIT[1695*9+8], INIT[1694*9+8], INIT[1693*9+8], INIT[1692*9+8], + INIT[1691*9+8], INIT[1690*9+8], INIT[1689*9+8], INIT[1688*9+8], + INIT[1687*9+8], INIT[1686*9+8], INIT[1685*9+8], INIT[1684*9+8], + INIT[1683*9+8], INIT[1682*9+8], INIT[1681*9+8], INIT[1680*9+8], + INIT[1679*9+8], INIT[1678*9+8], INIT[1677*9+8], INIT[1676*9+8], + INIT[1675*9+8], INIT[1674*9+8], INIT[1673*9+8], INIT[1672*9+8], + INIT[1671*9+8], INIT[1670*9+8], INIT[1669*9+8], INIT[1668*9+8], + INIT[1667*9+8], INIT[1666*9+8], INIT[1665*9+8], INIT[1664*9+8], + INIT[1663*9+8], INIT[1662*9+8], INIT[1661*9+8], INIT[1660*9+8], + INIT[1659*9+8], INIT[1658*9+8], INIT[1657*9+8], INIT[1656*9+8], + INIT[1655*9+8], INIT[1654*9+8], INIT[1653*9+8], INIT[1652*9+8], + INIT[1651*9+8], INIT[1650*9+8], INIT[1649*9+8], INIT[1648*9+8], + INIT[1647*9+8], INIT[1646*9+8], INIT[1645*9+8], INIT[1644*9+8], + INIT[1643*9+8], INIT[1642*9+8], INIT[1641*9+8], INIT[1640*9+8], + INIT[1639*9+8], INIT[1638*9+8], INIT[1637*9+8], INIT[1636*9+8], + INIT[1635*9+8], INIT[1634*9+8], INIT[1633*9+8], INIT[1632*9+8], + INIT[1631*9+8], INIT[1630*9+8], INIT[1629*9+8], INIT[1628*9+8], + INIT[1627*9+8], INIT[1626*9+8], INIT[1625*9+8], INIT[1624*9+8], + INIT[1623*9+8], INIT[1622*9+8], INIT[1621*9+8], INIT[1620*9+8], + INIT[1619*9+8], INIT[1618*9+8], INIT[1617*9+8], INIT[1616*9+8], + INIT[1615*9+8], INIT[1614*9+8], INIT[1613*9+8], INIT[1612*9+8], + INIT[1611*9+8], INIT[1610*9+8], INIT[1609*9+8], INIT[1608*9+8], + INIT[1607*9+8], INIT[1606*9+8], INIT[1605*9+8], INIT[1604*9+8], + INIT[1603*9+8], INIT[1602*9+8], INIT[1601*9+8], INIT[1600*9+8], + INIT[1599*9+8], INIT[1598*9+8], INIT[1597*9+8], INIT[1596*9+8], + INIT[1595*9+8], INIT[1594*9+8], INIT[1593*9+8], INIT[1592*9+8], + INIT[1591*9+8], INIT[1590*9+8], INIT[1589*9+8], INIT[1588*9+8], + INIT[1587*9+8], INIT[1586*9+8], INIT[1585*9+8], INIT[1584*9+8], + INIT[1583*9+8], INIT[1582*9+8], INIT[1581*9+8], INIT[1580*9+8], + INIT[1579*9+8], INIT[1578*9+8], INIT[1577*9+8], INIT[1576*9+8], + INIT[1575*9+8], INIT[1574*9+8], INIT[1573*9+8], INIT[1572*9+8], + INIT[1571*9+8], INIT[1570*9+8], INIT[1569*9+8], INIT[1568*9+8], + INIT[1567*9+8], INIT[1566*9+8], INIT[1565*9+8], INIT[1564*9+8], + INIT[1563*9+8], INIT[1562*9+8], INIT[1561*9+8], INIT[1560*9+8], + INIT[1559*9+8], INIT[1558*9+8], INIT[1557*9+8], INIT[1556*9+8], + INIT[1555*9+8], INIT[1554*9+8], INIT[1553*9+8], INIT[1552*9+8], + INIT[1551*9+8], INIT[1550*9+8], INIT[1549*9+8], INIT[1548*9+8], + INIT[1547*9+8], INIT[1546*9+8], INIT[1545*9+8], INIT[1544*9+8], + INIT[1543*9+8], INIT[1542*9+8], INIT[1541*9+8], INIT[1540*9+8], + INIT[1539*9+8], INIT[1538*9+8], INIT[1537*9+8], INIT[1536*9+8]}), +.INITP_07({INIT[2047*9+8], INIT[2046*9+8], INIT[2045*9+8], INIT[2044*9+8], + INIT[2043*9+8], INIT[2042*9+8], INIT[2041*9+8], INIT[2040*9+8], + INIT[2039*9+8], INIT[2038*9+8], INIT[2037*9+8], INIT[2036*9+8], + INIT[2035*9+8], INIT[2034*9+8], INIT[2033*9+8], INIT[2032*9+8], + INIT[2031*9+8], INIT[2030*9+8], INIT[2029*9+8], INIT[2028*9+8], + INIT[2027*9+8], INIT[2026*9+8], INIT[2025*9+8], INIT[2024*9+8], + INIT[2023*9+8], INIT[2022*9+8], INIT[2021*9+8], INIT[2020*9+8], + INIT[2019*9+8], INIT[2018*9+8], INIT[2017*9+8], INIT[2016*9+8], + INIT[2015*9+8], INIT[2014*9+8], INIT[2013*9+8], INIT[2012*9+8], + INIT[2011*9+8], INIT[2010*9+8], INIT[2009*9+8], INIT[2008*9+8], + INIT[2007*9+8], INIT[2006*9+8], INIT[2005*9+8], INIT[2004*9+8], + INIT[2003*9+8], INIT[2002*9+8], INIT[2001*9+8], INIT[2000*9+8], + INIT[1999*9+8], INIT[1998*9+8], INIT[1997*9+8], INIT[1996*9+8], + INIT[1995*9+8], INIT[1994*9+8], INIT[1993*9+8], INIT[1992*9+8], + INIT[1991*9+8], INIT[1990*9+8], INIT[1989*9+8], INIT[1988*9+8], + INIT[1987*9+8], INIT[1986*9+8], INIT[1985*9+8], INIT[1984*9+8], + INIT[1983*9+8], INIT[1982*9+8], INIT[1981*9+8], INIT[1980*9+8], + INIT[1979*9+8], INIT[1978*9+8], INIT[1977*9+8], INIT[1976*9+8], + INIT[1975*9+8], INIT[1974*9+8], INIT[1973*9+8], INIT[1972*9+8], + INIT[1971*9+8], INIT[1970*9+8], INIT[1969*9+8], INIT[1968*9+8], + INIT[1967*9+8], INIT[1966*9+8], INIT[1965*9+8], INIT[1964*9+8], + INIT[1963*9+8], INIT[1962*9+8], INIT[1961*9+8], INIT[1960*9+8], + INIT[1959*9+8], INIT[1958*9+8], INIT[1957*9+8], INIT[1956*9+8], + INIT[1955*9+8], INIT[1954*9+8], INIT[1953*9+8], INIT[1952*9+8], + INIT[1951*9+8], INIT[1950*9+8], INIT[1949*9+8], INIT[1948*9+8], + INIT[1947*9+8], INIT[1946*9+8], INIT[1945*9+8], INIT[1944*9+8], + INIT[1943*9+8], INIT[1942*9+8], INIT[1941*9+8], INIT[1940*9+8], + INIT[1939*9+8], INIT[1938*9+8], INIT[1937*9+8], INIT[1936*9+8], + INIT[1935*9+8], INIT[1934*9+8], INIT[1933*9+8], INIT[1932*9+8], + INIT[1931*9+8], INIT[1930*9+8], INIT[1929*9+8], INIT[1928*9+8], + INIT[1927*9+8], INIT[1926*9+8], INIT[1925*9+8], INIT[1924*9+8], + INIT[1923*9+8], INIT[1922*9+8], INIT[1921*9+8], INIT[1920*9+8], + INIT[1919*9+8], INIT[1918*9+8], INIT[1917*9+8], INIT[1916*9+8], + INIT[1915*9+8], INIT[1914*9+8], INIT[1913*9+8], INIT[1912*9+8], + INIT[1911*9+8], INIT[1910*9+8], INIT[1909*9+8], INIT[1908*9+8], + INIT[1907*9+8], INIT[1906*9+8], INIT[1905*9+8], INIT[1904*9+8], + INIT[1903*9+8], INIT[1902*9+8], INIT[1901*9+8], INIT[1900*9+8], + INIT[1899*9+8], INIT[1898*9+8], INIT[1897*9+8], INIT[1896*9+8], + INIT[1895*9+8], INIT[1894*9+8], INIT[1893*9+8], INIT[1892*9+8], + INIT[1891*9+8], INIT[1890*9+8], INIT[1889*9+8], INIT[1888*9+8], + INIT[1887*9+8], INIT[1886*9+8], INIT[1885*9+8], INIT[1884*9+8], + INIT[1883*9+8], INIT[1882*9+8], INIT[1881*9+8], INIT[1880*9+8], + INIT[1879*9+8], INIT[1878*9+8], INIT[1877*9+8], INIT[1876*9+8], + INIT[1875*9+8], INIT[1874*9+8], INIT[1873*9+8], INIT[1872*9+8], + INIT[1871*9+8], INIT[1870*9+8], INIT[1869*9+8], INIT[1868*9+8], + INIT[1867*9+8], INIT[1866*9+8], INIT[1865*9+8], INIT[1864*9+8], + INIT[1863*9+8], INIT[1862*9+8], INIT[1861*9+8], INIT[1860*9+8], + INIT[1859*9+8], INIT[1858*9+8], INIT[1857*9+8], INIT[1856*9+8], + INIT[1855*9+8], INIT[1854*9+8], INIT[1853*9+8], INIT[1852*9+8], + INIT[1851*9+8], INIT[1850*9+8], INIT[1849*9+8], INIT[1848*9+8], + INIT[1847*9+8], INIT[1846*9+8], INIT[1845*9+8], INIT[1844*9+8], + INIT[1843*9+8], INIT[1842*9+8], INIT[1841*9+8], INIT[1840*9+8], + INIT[1839*9+8], INIT[1838*9+8], INIT[1837*9+8], INIT[1836*9+8], + INIT[1835*9+8], INIT[1834*9+8], INIT[1833*9+8], INIT[1832*9+8], + INIT[1831*9+8], INIT[1830*9+8], INIT[1829*9+8], INIT[1828*9+8], + INIT[1827*9+8], INIT[1826*9+8], INIT[1825*9+8], INIT[1824*9+8], + INIT[1823*9+8], INIT[1822*9+8], INIT[1821*9+8], INIT[1820*9+8], + INIT[1819*9+8], INIT[1818*9+8], INIT[1817*9+8], INIT[1816*9+8], + INIT[1815*9+8], INIT[1814*9+8], INIT[1813*9+8], INIT[1812*9+8], + INIT[1811*9+8], INIT[1810*9+8], INIT[1809*9+8], INIT[1808*9+8], + INIT[1807*9+8], INIT[1806*9+8], INIT[1805*9+8], INIT[1804*9+8], + INIT[1803*9+8], INIT[1802*9+8], INIT[1801*9+8], INIT[1800*9+8], + INIT[1799*9+8], INIT[1798*9+8], INIT[1797*9+8], INIT[1796*9+8], + INIT[1795*9+8], INIT[1794*9+8], INIT[1793*9+8], INIT[1792*9+8]}), +.INITP_08({INIT[2303*9+8], INIT[2302*9+8], INIT[2301*9+8], INIT[2300*9+8], + INIT[2299*9+8], INIT[2298*9+8], INIT[2297*9+8], INIT[2296*9+8], + INIT[2295*9+8], INIT[2294*9+8], INIT[2293*9+8], INIT[2292*9+8], + INIT[2291*9+8], INIT[2290*9+8], INIT[2289*9+8], INIT[2288*9+8], + INIT[2287*9+8], INIT[2286*9+8], INIT[2285*9+8], INIT[2284*9+8], + INIT[2283*9+8], INIT[2282*9+8], INIT[2281*9+8], INIT[2280*9+8], + INIT[2279*9+8], INIT[2278*9+8], INIT[2277*9+8], INIT[2276*9+8], + INIT[2275*9+8], INIT[2274*9+8], INIT[2273*9+8], INIT[2272*9+8], + INIT[2271*9+8], INIT[2270*9+8], INIT[2269*9+8], INIT[2268*9+8], + INIT[2267*9+8], INIT[2266*9+8], INIT[2265*9+8], INIT[2264*9+8], + INIT[2263*9+8], INIT[2262*9+8], INIT[2261*9+8], INIT[2260*9+8], + INIT[2259*9+8], INIT[2258*9+8], INIT[2257*9+8], INIT[2256*9+8], + INIT[2255*9+8], INIT[2254*9+8], INIT[2253*9+8], INIT[2252*9+8], + INIT[2251*9+8], INIT[2250*9+8], INIT[2249*9+8], INIT[2248*9+8], + INIT[2247*9+8], INIT[2246*9+8], INIT[2245*9+8], INIT[2244*9+8], + INIT[2243*9+8], INIT[2242*9+8], INIT[2241*9+8], INIT[2240*9+8], + INIT[2239*9+8], INIT[2238*9+8], INIT[2237*9+8], INIT[2236*9+8], + INIT[2235*9+8], INIT[2234*9+8], INIT[2233*9+8], INIT[2232*9+8], + INIT[2231*9+8], INIT[2230*9+8], INIT[2229*9+8], INIT[2228*9+8], + INIT[2227*9+8], INIT[2226*9+8], INIT[2225*9+8], INIT[2224*9+8], + INIT[2223*9+8], INIT[2222*9+8], INIT[2221*9+8], INIT[2220*9+8], + INIT[2219*9+8], INIT[2218*9+8], INIT[2217*9+8], INIT[2216*9+8], + INIT[2215*9+8], INIT[2214*9+8], INIT[2213*9+8], INIT[2212*9+8], + INIT[2211*9+8], INIT[2210*9+8], INIT[2209*9+8], INIT[2208*9+8], + INIT[2207*9+8], INIT[2206*9+8], INIT[2205*9+8], INIT[2204*9+8], + INIT[2203*9+8], INIT[2202*9+8], INIT[2201*9+8], INIT[2200*9+8], + INIT[2199*9+8], INIT[2198*9+8], INIT[2197*9+8], INIT[2196*9+8], + INIT[2195*9+8], INIT[2194*9+8], INIT[2193*9+8], INIT[2192*9+8], + INIT[2191*9+8], INIT[2190*9+8], INIT[2189*9+8], INIT[2188*9+8], + INIT[2187*9+8], INIT[2186*9+8], INIT[2185*9+8], INIT[2184*9+8], + INIT[2183*9+8], INIT[2182*9+8], INIT[2181*9+8], INIT[2180*9+8], + INIT[2179*9+8], INIT[2178*9+8], INIT[2177*9+8], INIT[2176*9+8], + INIT[2175*9+8], INIT[2174*9+8], INIT[2173*9+8], INIT[2172*9+8], + INIT[2171*9+8], INIT[2170*9+8], INIT[2169*9+8], INIT[2168*9+8], + INIT[2167*9+8], INIT[2166*9+8], INIT[2165*9+8], INIT[2164*9+8], + INIT[2163*9+8], INIT[2162*9+8], INIT[2161*9+8], INIT[2160*9+8], + INIT[2159*9+8], INIT[2158*9+8], INIT[2157*9+8], INIT[2156*9+8], + INIT[2155*9+8], INIT[2154*9+8], INIT[2153*9+8], INIT[2152*9+8], + INIT[2151*9+8], INIT[2150*9+8], INIT[2149*9+8], INIT[2148*9+8], + INIT[2147*9+8], INIT[2146*9+8], INIT[2145*9+8], INIT[2144*9+8], + INIT[2143*9+8], INIT[2142*9+8], INIT[2141*9+8], INIT[2140*9+8], + INIT[2139*9+8], INIT[2138*9+8], INIT[2137*9+8], INIT[2136*9+8], + INIT[2135*9+8], INIT[2134*9+8], INIT[2133*9+8], INIT[2132*9+8], + INIT[2131*9+8], INIT[2130*9+8], INIT[2129*9+8], INIT[2128*9+8], + INIT[2127*9+8], INIT[2126*9+8], INIT[2125*9+8], INIT[2124*9+8], + INIT[2123*9+8], INIT[2122*9+8], INIT[2121*9+8], INIT[2120*9+8], + INIT[2119*9+8], INIT[2118*9+8], INIT[2117*9+8], INIT[2116*9+8], + INIT[2115*9+8], INIT[2114*9+8], INIT[2113*9+8], INIT[2112*9+8], + INIT[2111*9+8], INIT[2110*9+8], INIT[2109*9+8], INIT[2108*9+8], + INIT[2107*9+8], INIT[2106*9+8], INIT[2105*9+8], INIT[2104*9+8], + INIT[2103*9+8], INIT[2102*9+8], INIT[2101*9+8], INIT[2100*9+8], + INIT[2099*9+8], INIT[2098*9+8], INIT[2097*9+8], INIT[2096*9+8], + INIT[2095*9+8], INIT[2094*9+8], INIT[2093*9+8], INIT[2092*9+8], + INIT[2091*9+8], INIT[2090*9+8], INIT[2089*9+8], INIT[2088*9+8], + INIT[2087*9+8], INIT[2086*9+8], INIT[2085*9+8], INIT[2084*9+8], + INIT[2083*9+8], INIT[2082*9+8], INIT[2081*9+8], INIT[2080*9+8], + INIT[2079*9+8], INIT[2078*9+8], INIT[2077*9+8], INIT[2076*9+8], + INIT[2075*9+8], INIT[2074*9+8], INIT[2073*9+8], INIT[2072*9+8], + INIT[2071*9+8], INIT[2070*9+8], INIT[2069*9+8], INIT[2068*9+8], + INIT[2067*9+8], INIT[2066*9+8], INIT[2065*9+8], INIT[2064*9+8], + INIT[2063*9+8], INIT[2062*9+8], INIT[2061*9+8], INIT[2060*9+8], + INIT[2059*9+8], INIT[2058*9+8], INIT[2057*9+8], INIT[2056*9+8], + INIT[2055*9+8], INIT[2054*9+8], INIT[2053*9+8], INIT[2052*9+8], + INIT[2051*9+8], INIT[2050*9+8], INIT[2049*9+8], INIT[2048*9+8]}), +.INITP_09({INIT[2559*9+8], INIT[2558*9+8], INIT[2557*9+8], INIT[2556*9+8], + INIT[2555*9+8], INIT[2554*9+8], INIT[2553*9+8], INIT[2552*9+8], + INIT[2551*9+8], INIT[2550*9+8], INIT[2549*9+8], INIT[2548*9+8], + INIT[2547*9+8], INIT[2546*9+8], INIT[2545*9+8], INIT[2544*9+8], + INIT[2543*9+8], INIT[2542*9+8], INIT[2541*9+8], INIT[2540*9+8], + INIT[2539*9+8], INIT[2538*9+8], INIT[2537*9+8], INIT[2536*9+8], + INIT[2535*9+8], INIT[2534*9+8], INIT[2533*9+8], INIT[2532*9+8], + INIT[2531*9+8], INIT[2530*9+8], INIT[2529*9+8], INIT[2528*9+8], + INIT[2527*9+8], INIT[2526*9+8], INIT[2525*9+8], INIT[2524*9+8], + INIT[2523*9+8], INIT[2522*9+8], INIT[2521*9+8], INIT[2520*9+8], + INIT[2519*9+8], INIT[2518*9+8], INIT[2517*9+8], INIT[2516*9+8], + INIT[2515*9+8], INIT[2514*9+8], INIT[2513*9+8], INIT[2512*9+8], + INIT[2511*9+8], INIT[2510*9+8], INIT[2509*9+8], INIT[2508*9+8], + INIT[2507*9+8], INIT[2506*9+8], INIT[2505*9+8], INIT[2504*9+8], + INIT[2503*9+8], INIT[2502*9+8], INIT[2501*9+8], INIT[2500*9+8], + INIT[2499*9+8], INIT[2498*9+8], INIT[2497*9+8], INIT[2496*9+8], + INIT[2495*9+8], INIT[2494*9+8], INIT[2493*9+8], INIT[2492*9+8], + INIT[2491*9+8], INIT[2490*9+8], INIT[2489*9+8], INIT[2488*9+8], + INIT[2487*9+8], INIT[2486*9+8], INIT[2485*9+8], INIT[2484*9+8], + INIT[2483*9+8], INIT[2482*9+8], INIT[2481*9+8], INIT[2480*9+8], + INIT[2479*9+8], INIT[2478*9+8], INIT[2477*9+8], INIT[2476*9+8], + INIT[2475*9+8], INIT[2474*9+8], INIT[2473*9+8], INIT[2472*9+8], + INIT[2471*9+8], INIT[2470*9+8], INIT[2469*9+8], INIT[2468*9+8], + INIT[2467*9+8], INIT[2466*9+8], INIT[2465*9+8], INIT[2464*9+8], + INIT[2463*9+8], INIT[2462*9+8], INIT[2461*9+8], INIT[2460*9+8], + INIT[2459*9+8], INIT[2458*9+8], INIT[2457*9+8], INIT[2456*9+8], + INIT[2455*9+8], INIT[2454*9+8], INIT[2453*9+8], INIT[2452*9+8], + INIT[2451*9+8], INIT[2450*9+8], INIT[2449*9+8], INIT[2448*9+8], + INIT[2447*9+8], INIT[2446*9+8], INIT[2445*9+8], INIT[2444*9+8], + INIT[2443*9+8], INIT[2442*9+8], INIT[2441*9+8], INIT[2440*9+8], + INIT[2439*9+8], INIT[2438*9+8], INIT[2437*9+8], INIT[2436*9+8], + INIT[2435*9+8], INIT[2434*9+8], INIT[2433*9+8], INIT[2432*9+8], + INIT[2431*9+8], INIT[2430*9+8], INIT[2429*9+8], INIT[2428*9+8], + INIT[2427*9+8], INIT[2426*9+8], INIT[2425*9+8], INIT[2424*9+8], + INIT[2423*9+8], INIT[2422*9+8], INIT[2421*9+8], INIT[2420*9+8], + INIT[2419*9+8], INIT[2418*9+8], INIT[2417*9+8], INIT[2416*9+8], + INIT[2415*9+8], INIT[2414*9+8], INIT[2413*9+8], INIT[2412*9+8], + INIT[2411*9+8], INIT[2410*9+8], INIT[2409*9+8], INIT[2408*9+8], + INIT[2407*9+8], INIT[2406*9+8], INIT[2405*9+8], INIT[2404*9+8], + INIT[2403*9+8], INIT[2402*9+8], INIT[2401*9+8], INIT[2400*9+8], + INIT[2399*9+8], INIT[2398*9+8], INIT[2397*9+8], INIT[2396*9+8], + INIT[2395*9+8], INIT[2394*9+8], INIT[2393*9+8], INIT[2392*9+8], + INIT[2391*9+8], INIT[2390*9+8], INIT[2389*9+8], INIT[2388*9+8], + INIT[2387*9+8], INIT[2386*9+8], INIT[2385*9+8], INIT[2384*9+8], + INIT[2383*9+8], INIT[2382*9+8], INIT[2381*9+8], INIT[2380*9+8], + INIT[2379*9+8], INIT[2378*9+8], INIT[2377*9+8], INIT[2376*9+8], + INIT[2375*9+8], INIT[2374*9+8], INIT[2373*9+8], INIT[2372*9+8], + INIT[2371*9+8], INIT[2370*9+8], INIT[2369*9+8], INIT[2368*9+8], + INIT[2367*9+8], INIT[2366*9+8], INIT[2365*9+8], INIT[2364*9+8], + INIT[2363*9+8], INIT[2362*9+8], INIT[2361*9+8], INIT[2360*9+8], + INIT[2359*9+8], INIT[2358*9+8], INIT[2357*9+8], INIT[2356*9+8], + INIT[2355*9+8], INIT[2354*9+8], INIT[2353*9+8], INIT[2352*9+8], + INIT[2351*9+8], INIT[2350*9+8], INIT[2349*9+8], INIT[2348*9+8], + INIT[2347*9+8], INIT[2346*9+8], INIT[2345*9+8], INIT[2344*9+8], + INIT[2343*9+8], INIT[2342*9+8], INIT[2341*9+8], INIT[2340*9+8], + INIT[2339*9+8], INIT[2338*9+8], INIT[2337*9+8], INIT[2336*9+8], + INIT[2335*9+8], INIT[2334*9+8], INIT[2333*9+8], INIT[2332*9+8], + INIT[2331*9+8], INIT[2330*9+8], INIT[2329*9+8], INIT[2328*9+8], + INIT[2327*9+8], INIT[2326*9+8], INIT[2325*9+8], INIT[2324*9+8], + INIT[2323*9+8], INIT[2322*9+8], INIT[2321*9+8], INIT[2320*9+8], + INIT[2319*9+8], INIT[2318*9+8], INIT[2317*9+8], INIT[2316*9+8], + INIT[2315*9+8], INIT[2314*9+8], INIT[2313*9+8], INIT[2312*9+8], + INIT[2311*9+8], INIT[2310*9+8], INIT[2309*9+8], INIT[2308*9+8], + INIT[2307*9+8], INIT[2306*9+8], INIT[2305*9+8], INIT[2304*9+8]}), +.INITP_0A({INIT[2815*9+8], INIT[2814*9+8], INIT[2813*9+8], INIT[2812*9+8], + INIT[2811*9+8], INIT[2810*9+8], INIT[2809*9+8], INIT[2808*9+8], + INIT[2807*9+8], INIT[2806*9+8], INIT[2805*9+8], INIT[2804*9+8], + INIT[2803*9+8], INIT[2802*9+8], INIT[2801*9+8], INIT[2800*9+8], + INIT[2799*9+8], INIT[2798*9+8], INIT[2797*9+8], INIT[2796*9+8], + INIT[2795*9+8], INIT[2794*9+8], INIT[2793*9+8], INIT[2792*9+8], + INIT[2791*9+8], INIT[2790*9+8], INIT[2789*9+8], INIT[2788*9+8], + INIT[2787*9+8], INIT[2786*9+8], INIT[2785*9+8], INIT[2784*9+8], + INIT[2783*9+8], INIT[2782*9+8], INIT[2781*9+8], INIT[2780*9+8], + INIT[2779*9+8], INIT[2778*9+8], INIT[2777*9+8], INIT[2776*9+8], + INIT[2775*9+8], INIT[2774*9+8], INIT[2773*9+8], INIT[2772*9+8], + INIT[2771*9+8], INIT[2770*9+8], INIT[2769*9+8], INIT[2768*9+8], + INIT[2767*9+8], INIT[2766*9+8], INIT[2765*9+8], INIT[2764*9+8], + INIT[2763*9+8], INIT[2762*9+8], INIT[2761*9+8], INIT[2760*9+8], + INIT[2759*9+8], INIT[2758*9+8], INIT[2757*9+8], INIT[2756*9+8], + INIT[2755*9+8], INIT[2754*9+8], INIT[2753*9+8], INIT[2752*9+8], + INIT[2751*9+8], INIT[2750*9+8], INIT[2749*9+8], INIT[2748*9+8], + INIT[2747*9+8], INIT[2746*9+8], INIT[2745*9+8], INIT[2744*9+8], + INIT[2743*9+8], INIT[2742*9+8], INIT[2741*9+8], INIT[2740*9+8], + INIT[2739*9+8], INIT[2738*9+8], INIT[2737*9+8], INIT[2736*9+8], + INIT[2735*9+8], INIT[2734*9+8], INIT[2733*9+8], INIT[2732*9+8], + INIT[2731*9+8], INIT[2730*9+8], INIT[2729*9+8], INIT[2728*9+8], + INIT[2727*9+8], INIT[2726*9+8], INIT[2725*9+8], INIT[2724*9+8], + INIT[2723*9+8], INIT[2722*9+8], INIT[2721*9+8], INIT[2720*9+8], + INIT[2719*9+8], INIT[2718*9+8], INIT[2717*9+8], INIT[2716*9+8], + INIT[2715*9+8], INIT[2714*9+8], INIT[2713*9+8], INIT[2712*9+8], + INIT[2711*9+8], INIT[2710*9+8], INIT[2709*9+8], INIT[2708*9+8], + INIT[2707*9+8], INIT[2706*9+8], INIT[2705*9+8], INIT[2704*9+8], + INIT[2703*9+8], INIT[2702*9+8], INIT[2701*9+8], INIT[2700*9+8], + INIT[2699*9+8], INIT[2698*9+8], INIT[2697*9+8], INIT[2696*9+8], + INIT[2695*9+8], INIT[2694*9+8], INIT[2693*9+8], INIT[2692*9+8], + INIT[2691*9+8], INIT[2690*9+8], INIT[2689*9+8], INIT[2688*9+8], + INIT[2687*9+8], INIT[2686*9+8], INIT[2685*9+8], INIT[2684*9+8], + INIT[2683*9+8], INIT[2682*9+8], INIT[2681*9+8], INIT[2680*9+8], + INIT[2679*9+8], INIT[2678*9+8], INIT[2677*9+8], INIT[2676*9+8], + INIT[2675*9+8], INIT[2674*9+8], INIT[2673*9+8], INIT[2672*9+8], + INIT[2671*9+8], INIT[2670*9+8], INIT[2669*9+8], INIT[2668*9+8], + INIT[2667*9+8], INIT[2666*9+8], INIT[2665*9+8], INIT[2664*9+8], + INIT[2663*9+8], INIT[2662*9+8], INIT[2661*9+8], INIT[2660*9+8], + INIT[2659*9+8], INIT[2658*9+8], INIT[2657*9+8], INIT[2656*9+8], + INIT[2655*9+8], INIT[2654*9+8], INIT[2653*9+8], INIT[2652*9+8], + INIT[2651*9+8], INIT[2650*9+8], INIT[2649*9+8], INIT[2648*9+8], + INIT[2647*9+8], INIT[2646*9+8], INIT[2645*9+8], INIT[2644*9+8], + INIT[2643*9+8], INIT[2642*9+8], INIT[2641*9+8], INIT[2640*9+8], + INIT[2639*9+8], INIT[2638*9+8], INIT[2637*9+8], INIT[2636*9+8], + INIT[2635*9+8], INIT[2634*9+8], INIT[2633*9+8], INIT[2632*9+8], + INIT[2631*9+8], INIT[2630*9+8], INIT[2629*9+8], INIT[2628*9+8], + INIT[2627*9+8], INIT[2626*9+8], INIT[2625*9+8], INIT[2624*9+8], + INIT[2623*9+8], INIT[2622*9+8], INIT[2621*9+8], INIT[2620*9+8], + INIT[2619*9+8], INIT[2618*9+8], INIT[2617*9+8], INIT[2616*9+8], + INIT[2615*9+8], INIT[2614*9+8], INIT[2613*9+8], INIT[2612*9+8], + INIT[2611*9+8], INIT[2610*9+8], INIT[2609*9+8], INIT[2608*9+8], + INIT[2607*9+8], INIT[2606*9+8], INIT[2605*9+8], INIT[2604*9+8], + INIT[2603*9+8], INIT[2602*9+8], INIT[2601*9+8], INIT[2600*9+8], + INIT[2599*9+8], INIT[2598*9+8], INIT[2597*9+8], INIT[2596*9+8], + INIT[2595*9+8], INIT[2594*9+8], INIT[2593*9+8], INIT[2592*9+8], + INIT[2591*9+8], INIT[2590*9+8], INIT[2589*9+8], INIT[2588*9+8], + INIT[2587*9+8], INIT[2586*9+8], INIT[2585*9+8], INIT[2584*9+8], + INIT[2583*9+8], INIT[2582*9+8], INIT[2581*9+8], INIT[2580*9+8], + INIT[2579*9+8], INIT[2578*9+8], INIT[2577*9+8], INIT[2576*9+8], + INIT[2575*9+8], INIT[2574*9+8], INIT[2573*9+8], INIT[2572*9+8], + INIT[2571*9+8], INIT[2570*9+8], INIT[2569*9+8], INIT[2568*9+8], + INIT[2567*9+8], INIT[2566*9+8], INIT[2565*9+8], INIT[2564*9+8], + INIT[2563*9+8], INIT[2562*9+8], INIT[2561*9+8], INIT[2560*9+8]}), +.INITP_0B({INIT[3071*9+8], INIT[3070*9+8], INIT[3069*9+8], INIT[3068*9+8], + INIT[3067*9+8], INIT[3066*9+8], INIT[3065*9+8], INIT[3064*9+8], + INIT[3063*9+8], INIT[3062*9+8], INIT[3061*9+8], INIT[3060*9+8], + INIT[3059*9+8], INIT[3058*9+8], INIT[3057*9+8], INIT[3056*9+8], + INIT[3055*9+8], INIT[3054*9+8], INIT[3053*9+8], INIT[3052*9+8], + INIT[3051*9+8], INIT[3050*9+8], INIT[3049*9+8], INIT[3048*9+8], + INIT[3047*9+8], INIT[3046*9+8], INIT[3045*9+8], INIT[3044*9+8], + INIT[3043*9+8], INIT[3042*9+8], INIT[3041*9+8], INIT[3040*9+8], + INIT[3039*9+8], INIT[3038*9+8], INIT[3037*9+8], INIT[3036*9+8], + INIT[3035*9+8], INIT[3034*9+8], INIT[3033*9+8], INIT[3032*9+8], + INIT[3031*9+8], INIT[3030*9+8], INIT[3029*9+8], INIT[3028*9+8], + INIT[3027*9+8], INIT[3026*9+8], INIT[3025*9+8], INIT[3024*9+8], + INIT[3023*9+8], INIT[3022*9+8], INIT[3021*9+8], INIT[3020*9+8], + INIT[3019*9+8], INIT[3018*9+8], INIT[3017*9+8], INIT[3016*9+8], + INIT[3015*9+8], INIT[3014*9+8], INIT[3013*9+8], INIT[3012*9+8], + INIT[3011*9+8], INIT[3010*9+8], INIT[3009*9+8], INIT[3008*9+8], + INIT[3007*9+8], INIT[3006*9+8], INIT[3005*9+8], INIT[3004*9+8], + INIT[3003*9+8], INIT[3002*9+8], INIT[3001*9+8], INIT[3000*9+8], + INIT[2999*9+8], INIT[2998*9+8], INIT[2997*9+8], INIT[2996*9+8], + INIT[2995*9+8], INIT[2994*9+8], INIT[2993*9+8], INIT[2992*9+8], + INIT[2991*9+8], INIT[2990*9+8], INIT[2989*9+8], INIT[2988*9+8], + INIT[2987*9+8], INIT[2986*9+8], INIT[2985*9+8], INIT[2984*9+8], + INIT[2983*9+8], INIT[2982*9+8], INIT[2981*9+8], INIT[2980*9+8], + INIT[2979*9+8], INIT[2978*9+8], INIT[2977*9+8], INIT[2976*9+8], + INIT[2975*9+8], INIT[2974*9+8], INIT[2973*9+8], INIT[2972*9+8], + INIT[2971*9+8], INIT[2970*9+8], INIT[2969*9+8], INIT[2968*9+8], + INIT[2967*9+8], INIT[2966*9+8], INIT[2965*9+8], INIT[2964*9+8], + INIT[2963*9+8], INIT[2962*9+8], INIT[2961*9+8], INIT[2960*9+8], + INIT[2959*9+8], INIT[2958*9+8], INIT[2957*9+8], INIT[2956*9+8], + INIT[2955*9+8], INIT[2954*9+8], INIT[2953*9+8], INIT[2952*9+8], + INIT[2951*9+8], INIT[2950*9+8], INIT[2949*9+8], INIT[2948*9+8], + INIT[2947*9+8], INIT[2946*9+8], INIT[2945*9+8], INIT[2944*9+8], + INIT[2943*9+8], INIT[2942*9+8], INIT[2941*9+8], INIT[2940*9+8], + INIT[2939*9+8], INIT[2938*9+8], INIT[2937*9+8], INIT[2936*9+8], + INIT[2935*9+8], INIT[2934*9+8], INIT[2933*9+8], INIT[2932*9+8], + INIT[2931*9+8], INIT[2930*9+8], INIT[2929*9+8], INIT[2928*9+8], + INIT[2927*9+8], INIT[2926*9+8], INIT[2925*9+8], INIT[2924*9+8], + INIT[2923*9+8], INIT[2922*9+8], INIT[2921*9+8], INIT[2920*9+8], + INIT[2919*9+8], INIT[2918*9+8], INIT[2917*9+8], INIT[2916*9+8], + INIT[2915*9+8], INIT[2914*9+8], INIT[2913*9+8], INIT[2912*9+8], + INIT[2911*9+8], INIT[2910*9+8], INIT[2909*9+8], INIT[2908*9+8], + INIT[2907*9+8], INIT[2906*9+8], INIT[2905*9+8], INIT[2904*9+8], + INIT[2903*9+8], INIT[2902*9+8], INIT[2901*9+8], INIT[2900*9+8], + INIT[2899*9+8], INIT[2898*9+8], INIT[2897*9+8], INIT[2896*9+8], + INIT[2895*9+8], INIT[2894*9+8], INIT[2893*9+8], INIT[2892*9+8], + INIT[2891*9+8], INIT[2890*9+8], INIT[2889*9+8], INIT[2888*9+8], + INIT[2887*9+8], INIT[2886*9+8], INIT[2885*9+8], INIT[2884*9+8], + INIT[2883*9+8], INIT[2882*9+8], INIT[2881*9+8], INIT[2880*9+8], + INIT[2879*9+8], INIT[2878*9+8], INIT[2877*9+8], INIT[2876*9+8], + INIT[2875*9+8], INIT[2874*9+8], INIT[2873*9+8], INIT[2872*9+8], + INIT[2871*9+8], INIT[2870*9+8], INIT[2869*9+8], INIT[2868*9+8], + INIT[2867*9+8], INIT[2866*9+8], INIT[2865*9+8], INIT[2864*9+8], + INIT[2863*9+8], INIT[2862*9+8], INIT[2861*9+8], INIT[2860*9+8], + INIT[2859*9+8], INIT[2858*9+8], INIT[2857*9+8], INIT[2856*9+8], + INIT[2855*9+8], INIT[2854*9+8], INIT[2853*9+8], INIT[2852*9+8], + INIT[2851*9+8], INIT[2850*9+8], INIT[2849*9+8], INIT[2848*9+8], + INIT[2847*9+8], INIT[2846*9+8], INIT[2845*9+8], INIT[2844*9+8], + INIT[2843*9+8], INIT[2842*9+8], INIT[2841*9+8], INIT[2840*9+8], + INIT[2839*9+8], INIT[2838*9+8], INIT[2837*9+8], INIT[2836*9+8], + INIT[2835*9+8], INIT[2834*9+8], INIT[2833*9+8], INIT[2832*9+8], + INIT[2831*9+8], INIT[2830*9+8], INIT[2829*9+8], INIT[2828*9+8], + INIT[2827*9+8], INIT[2826*9+8], INIT[2825*9+8], INIT[2824*9+8], + INIT[2823*9+8], INIT[2822*9+8], INIT[2821*9+8], INIT[2820*9+8], + INIT[2819*9+8], INIT[2818*9+8], INIT[2817*9+8], INIT[2816*9+8]}), +.INITP_0C({INIT[3327*9+8], INIT[3326*9+8], INIT[3325*9+8], INIT[3324*9+8], + INIT[3323*9+8], INIT[3322*9+8], INIT[3321*9+8], INIT[3320*9+8], + INIT[3319*9+8], INIT[3318*9+8], INIT[3317*9+8], INIT[3316*9+8], + INIT[3315*9+8], INIT[3314*9+8], INIT[3313*9+8], INIT[3312*9+8], + INIT[3311*9+8], INIT[3310*9+8], INIT[3309*9+8], INIT[3308*9+8], + INIT[3307*9+8], INIT[3306*9+8], INIT[3305*9+8], INIT[3304*9+8], + INIT[3303*9+8], INIT[3302*9+8], INIT[3301*9+8], INIT[3300*9+8], + INIT[3299*9+8], INIT[3298*9+8], INIT[3297*9+8], INIT[3296*9+8], + INIT[3295*9+8], INIT[3294*9+8], INIT[3293*9+8], INIT[3292*9+8], + INIT[3291*9+8], INIT[3290*9+8], INIT[3289*9+8], INIT[3288*9+8], + INIT[3287*9+8], INIT[3286*9+8], INIT[3285*9+8], INIT[3284*9+8], + INIT[3283*9+8], INIT[3282*9+8], INIT[3281*9+8], INIT[3280*9+8], + INIT[3279*9+8], INIT[3278*9+8], INIT[3277*9+8], INIT[3276*9+8], + INIT[3275*9+8], INIT[3274*9+8], INIT[3273*9+8], INIT[3272*9+8], + INIT[3271*9+8], INIT[3270*9+8], INIT[3269*9+8], INIT[3268*9+8], + INIT[3267*9+8], INIT[3266*9+8], INIT[3265*9+8], INIT[3264*9+8], + INIT[3263*9+8], INIT[3262*9+8], INIT[3261*9+8], INIT[3260*9+8], + INIT[3259*9+8], INIT[3258*9+8], INIT[3257*9+8], INIT[3256*9+8], + INIT[3255*9+8], INIT[3254*9+8], INIT[3253*9+8], INIT[3252*9+8], + INIT[3251*9+8], INIT[3250*9+8], INIT[3249*9+8], INIT[3248*9+8], + INIT[3247*9+8], INIT[3246*9+8], INIT[3245*9+8], INIT[3244*9+8], + INIT[3243*9+8], INIT[3242*9+8], INIT[3241*9+8], INIT[3240*9+8], + INIT[3239*9+8], INIT[3238*9+8], INIT[3237*9+8], INIT[3236*9+8], + INIT[3235*9+8], INIT[3234*9+8], INIT[3233*9+8], INIT[3232*9+8], + INIT[3231*9+8], INIT[3230*9+8], INIT[3229*9+8], INIT[3228*9+8], + INIT[3227*9+8], INIT[3226*9+8], INIT[3225*9+8], INIT[3224*9+8], + INIT[3223*9+8], INIT[3222*9+8], INIT[3221*9+8], INIT[3220*9+8], + INIT[3219*9+8], INIT[3218*9+8], INIT[3217*9+8], INIT[3216*9+8], + INIT[3215*9+8], INIT[3214*9+8], INIT[3213*9+8], INIT[3212*9+8], + INIT[3211*9+8], INIT[3210*9+8], INIT[3209*9+8], INIT[3208*9+8], + INIT[3207*9+8], INIT[3206*9+8], INIT[3205*9+8], INIT[3204*9+8], + INIT[3203*9+8], INIT[3202*9+8], INIT[3201*9+8], INIT[3200*9+8], + INIT[3199*9+8], INIT[3198*9+8], INIT[3197*9+8], INIT[3196*9+8], + INIT[3195*9+8], INIT[3194*9+8], INIT[3193*9+8], INIT[3192*9+8], + INIT[3191*9+8], INIT[3190*9+8], INIT[3189*9+8], INIT[3188*9+8], + INIT[3187*9+8], INIT[3186*9+8], INIT[3185*9+8], INIT[3184*9+8], + INIT[3183*9+8], INIT[3182*9+8], INIT[3181*9+8], INIT[3180*9+8], + INIT[3179*9+8], INIT[3178*9+8], INIT[3177*9+8], INIT[3176*9+8], + INIT[3175*9+8], INIT[3174*9+8], INIT[3173*9+8], INIT[3172*9+8], + INIT[3171*9+8], INIT[3170*9+8], INIT[3169*9+8], INIT[3168*9+8], + INIT[3167*9+8], INIT[3166*9+8], INIT[3165*9+8], INIT[3164*9+8], + INIT[3163*9+8], INIT[3162*9+8], INIT[3161*9+8], INIT[3160*9+8], + INIT[3159*9+8], INIT[3158*9+8], INIT[3157*9+8], INIT[3156*9+8], + INIT[3155*9+8], INIT[3154*9+8], INIT[3153*9+8], INIT[3152*9+8], + INIT[3151*9+8], INIT[3150*9+8], INIT[3149*9+8], INIT[3148*9+8], + INIT[3147*9+8], INIT[3146*9+8], INIT[3145*9+8], INIT[3144*9+8], + INIT[3143*9+8], INIT[3142*9+8], INIT[3141*9+8], INIT[3140*9+8], + INIT[3139*9+8], INIT[3138*9+8], INIT[3137*9+8], INIT[3136*9+8], + INIT[3135*9+8], INIT[3134*9+8], INIT[3133*9+8], INIT[3132*9+8], + INIT[3131*9+8], INIT[3130*9+8], INIT[3129*9+8], INIT[3128*9+8], + INIT[3127*9+8], INIT[3126*9+8], INIT[3125*9+8], INIT[3124*9+8], + INIT[3123*9+8], INIT[3122*9+8], INIT[3121*9+8], INIT[3120*9+8], + INIT[3119*9+8], INIT[3118*9+8], INIT[3117*9+8], INIT[3116*9+8], + INIT[3115*9+8], INIT[3114*9+8], INIT[3113*9+8], INIT[3112*9+8], + INIT[3111*9+8], INIT[3110*9+8], INIT[3109*9+8], INIT[3108*9+8], + INIT[3107*9+8], INIT[3106*9+8], INIT[3105*9+8], INIT[3104*9+8], + INIT[3103*9+8], INIT[3102*9+8], INIT[3101*9+8], INIT[3100*9+8], + INIT[3099*9+8], INIT[3098*9+8], INIT[3097*9+8], INIT[3096*9+8], + INIT[3095*9+8], INIT[3094*9+8], INIT[3093*9+8], INIT[3092*9+8], + INIT[3091*9+8], INIT[3090*9+8], INIT[3089*9+8], INIT[3088*9+8], + INIT[3087*9+8], INIT[3086*9+8], INIT[3085*9+8], INIT[3084*9+8], + INIT[3083*9+8], INIT[3082*9+8], INIT[3081*9+8], INIT[3080*9+8], + INIT[3079*9+8], INIT[3078*9+8], INIT[3077*9+8], INIT[3076*9+8], + INIT[3075*9+8], INIT[3074*9+8], INIT[3073*9+8], INIT[3072*9+8]}), +.INITP_0D({INIT[3583*9+8], INIT[3582*9+8], INIT[3581*9+8], INIT[3580*9+8], + INIT[3579*9+8], INIT[3578*9+8], INIT[3577*9+8], INIT[3576*9+8], + INIT[3575*9+8], INIT[3574*9+8], INIT[3573*9+8], INIT[3572*9+8], + INIT[3571*9+8], INIT[3570*9+8], INIT[3569*9+8], INIT[3568*9+8], + INIT[3567*9+8], INIT[3566*9+8], INIT[3565*9+8], INIT[3564*9+8], + INIT[3563*9+8], INIT[3562*9+8], INIT[3561*9+8], INIT[3560*9+8], + INIT[3559*9+8], INIT[3558*9+8], INIT[3557*9+8], INIT[3556*9+8], + INIT[3555*9+8], INIT[3554*9+8], INIT[3553*9+8], INIT[3552*9+8], + INIT[3551*9+8], INIT[3550*9+8], INIT[3549*9+8], INIT[3548*9+8], + INIT[3547*9+8], INIT[3546*9+8], INIT[3545*9+8], INIT[3544*9+8], + INIT[3543*9+8], INIT[3542*9+8], INIT[3541*9+8], INIT[3540*9+8], + INIT[3539*9+8], INIT[3538*9+8], INIT[3537*9+8], INIT[3536*9+8], + INIT[3535*9+8], INIT[3534*9+8], INIT[3533*9+8], INIT[3532*9+8], + INIT[3531*9+8], INIT[3530*9+8], INIT[3529*9+8], INIT[3528*9+8], + INIT[3527*9+8], INIT[3526*9+8], INIT[3525*9+8], INIT[3524*9+8], + INIT[3523*9+8], INIT[3522*9+8], INIT[3521*9+8], INIT[3520*9+8], + INIT[3519*9+8], INIT[3518*9+8], INIT[3517*9+8], INIT[3516*9+8], + INIT[3515*9+8], INIT[3514*9+8], INIT[3513*9+8], INIT[3512*9+8], + INIT[3511*9+8], INIT[3510*9+8], INIT[3509*9+8], INIT[3508*9+8], + INIT[3507*9+8], INIT[3506*9+8], INIT[3505*9+8], INIT[3504*9+8], + INIT[3503*9+8], INIT[3502*9+8], INIT[3501*9+8], INIT[3500*9+8], + INIT[3499*9+8], INIT[3498*9+8], INIT[3497*9+8], INIT[3496*9+8], + INIT[3495*9+8], INIT[3494*9+8], INIT[3493*9+8], INIT[3492*9+8], + INIT[3491*9+8], INIT[3490*9+8], INIT[3489*9+8], INIT[3488*9+8], + INIT[3487*9+8], INIT[3486*9+8], INIT[3485*9+8], INIT[3484*9+8], + INIT[3483*9+8], INIT[3482*9+8], INIT[3481*9+8], INIT[3480*9+8], + INIT[3479*9+8], INIT[3478*9+8], INIT[3477*9+8], INIT[3476*9+8], + INIT[3475*9+8], INIT[3474*9+8], INIT[3473*9+8], INIT[3472*9+8], + INIT[3471*9+8], INIT[3470*9+8], INIT[3469*9+8], INIT[3468*9+8], + INIT[3467*9+8], INIT[3466*9+8], INIT[3465*9+8], INIT[3464*9+8], + INIT[3463*9+8], INIT[3462*9+8], INIT[3461*9+8], INIT[3460*9+8], + INIT[3459*9+8], INIT[3458*9+8], INIT[3457*9+8], INIT[3456*9+8], + INIT[3455*9+8], INIT[3454*9+8], INIT[3453*9+8], INIT[3452*9+8], + INIT[3451*9+8], INIT[3450*9+8], INIT[3449*9+8], INIT[3448*9+8], + INIT[3447*9+8], INIT[3446*9+8], INIT[3445*9+8], INIT[3444*9+8], + INIT[3443*9+8], INIT[3442*9+8], INIT[3441*9+8], INIT[3440*9+8], + INIT[3439*9+8], INIT[3438*9+8], INIT[3437*9+8], INIT[3436*9+8], + INIT[3435*9+8], INIT[3434*9+8], INIT[3433*9+8], INIT[3432*9+8], + INIT[3431*9+8], INIT[3430*9+8], INIT[3429*9+8], INIT[3428*9+8], + INIT[3427*9+8], INIT[3426*9+8], INIT[3425*9+8], INIT[3424*9+8], + INIT[3423*9+8], INIT[3422*9+8], INIT[3421*9+8], INIT[3420*9+8], + INIT[3419*9+8], INIT[3418*9+8], INIT[3417*9+8], INIT[3416*9+8], + INIT[3415*9+8], INIT[3414*9+8], INIT[3413*9+8], INIT[3412*9+8], + INIT[3411*9+8], INIT[3410*9+8], INIT[3409*9+8], INIT[3408*9+8], + INIT[3407*9+8], INIT[3406*9+8], INIT[3405*9+8], INIT[3404*9+8], + INIT[3403*9+8], INIT[3402*9+8], INIT[3401*9+8], INIT[3400*9+8], + INIT[3399*9+8], INIT[3398*9+8], INIT[3397*9+8], INIT[3396*9+8], + INIT[3395*9+8], INIT[3394*9+8], INIT[3393*9+8], INIT[3392*9+8], + INIT[3391*9+8], INIT[3390*9+8], INIT[3389*9+8], INIT[3388*9+8], + INIT[3387*9+8], INIT[3386*9+8], INIT[3385*9+8], INIT[3384*9+8], + INIT[3383*9+8], INIT[3382*9+8], INIT[3381*9+8], INIT[3380*9+8], + INIT[3379*9+8], INIT[3378*9+8], INIT[3377*9+8], INIT[3376*9+8], + INIT[3375*9+8], INIT[3374*9+8], INIT[3373*9+8], INIT[3372*9+8], + INIT[3371*9+8], INIT[3370*9+8], INIT[3369*9+8], INIT[3368*9+8], + INIT[3367*9+8], INIT[3366*9+8], INIT[3365*9+8], INIT[3364*9+8], + INIT[3363*9+8], INIT[3362*9+8], INIT[3361*9+8], INIT[3360*9+8], + INIT[3359*9+8], INIT[3358*9+8], INIT[3357*9+8], INIT[3356*9+8], + INIT[3355*9+8], INIT[3354*9+8], INIT[3353*9+8], INIT[3352*9+8], + INIT[3351*9+8], INIT[3350*9+8], INIT[3349*9+8], INIT[3348*9+8], + INIT[3347*9+8], INIT[3346*9+8], INIT[3345*9+8], INIT[3344*9+8], + INIT[3343*9+8], INIT[3342*9+8], INIT[3341*9+8], INIT[3340*9+8], + INIT[3339*9+8], INIT[3338*9+8], INIT[3337*9+8], INIT[3336*9+8], + INIT[3335*9+8], INIT[3334*9+8], INIT[3333*9+8], INIT[3332*9+8], + INIT[3331*9+8], INIT[3330*9+8], INIT[3329*9+8], INIT[3328*9+8]}), +.INITP_0E({INIT[3839*9+8], INIT[3838*9+8], INIT[3837*9+8], INIT[3836*9+8], + INIT[3835*9+8], INIT[3834*9+8], INIT[3833*9+8], INIT[3832*9+8], + INIT[3831*9+8], INIT[3830*9+8], INIT[3829*9+8], INIT[3828*9+8], + INIT[3827*9+8], INIT[3826*9+8], INIT[3825*9+8], INIT[3824*9+8], + INIT[3823*9+8], INIT[3822*9+8], INIT[3821*9+8], INIT[3820*9+8], + INIT[3819*9+8], INIT[3818*9+8], INIT[3817*9+8], INIT[3816*9+8], + INIT[3815*9+8], INIT[3814*9+8], INIT[3813*9+8], INIT[3812*9+8], + INIT[3811*9+8], INIT[3810*9+8], INIT[3809*9+8], INIT[3808*9+8], + INIT[3807*9+8], INIT[3806*9+8], INIT[3805*9+8], INIT[3804*9+8], + INIT[3803*9+8], INIT[3802*9+8], INIT[3801*9+8], INIT[3800*9+8], + INIT[3799*9+8], INIT[3798*9+8], INIT[3797*9+8], INIT[3796*9+8], + INIT[3795*9+8], INIT[3794*9+8], INIT[3793*9+8], INIT[3792*9+8], + INIT[3791*9+8], INIT[3790*9+8], INIT[3789*9+8], INIT[3788*9+8], + INIT[3787*9+8], INIT[3786*9+8], INIT[3785*9+8], INIT[3784*9+8], + INIT[3783*9+8], INIT[3782*9+8], INIT[3781*9+8], INIT[3780*9+8], + INIT[3779*9+8], INIT[3778*9+8], INIT[3777*9+8], INIT[3776*9+8], + INIT[3775*9+8], INIT[3774*9+8], INIT[3773*9+8], INIT[3772*9+8], + INIT[3771*9+8], INIT[3770*9+8], INIT[3769*9+8], INIT[3768*9+8], + INIT[3767*9+8], INIT[3766*9+8], INIT[3765*9+8], INIT[3764*9+8], + INIT[3763*9+8], INIT[3762*9+8], INIT[3761*9+8], INIT[3760*9+8], + INIT[3759*9+8], INIT[3758*9+8], INIT[3757*9+8], INIT[3756*9+8], + INIT[3755*9+8], INIT[3754*9+8], INIT[3753*9+8], INIT[3752*9+8], + INIT[3751*9+8], INIT[3750*9+8], INIT[3749*9+8], INIT[3748*9+8], + INIT[3747*9+8], INIT[3746*9+8], INIT[3745*9+8], INIT[3744*9+8], + INIT[3743*9+8], INIT[3742*9+8], INIT[3741*9+8], INIT[3740*9+8], + INIT[3739*9+8], INIT[3738*9+8], INIT[3737*9+8], INIT[3736*9+8], + INIT[3735*9+8], INIT[3734*9+8], INIT[3733*9+8], INIT[3732*9+8], + INIT[3731*9+8], INIT[3730*9+8], INIT[3729*9+8], INIT[3728*9+8], + INIT[3727*9+8], INIT[3726*9+8], INIT[3725*9+8], INIT[3724*9+8], + INIT[3723*9+8], INIT[3722*9+8], INIT[3721*9+8], INIT[3720*9+8], + INIT[3719*9+8], INIT[3718*9+8], INIT[3717*9+8], INIT[3716*9+8], + INIT[3715*9+8], INIT[3714*9+8], INIT[3713*9+8], INIT[3712*9+8], + INIT[3711*9+8], INIT[3710*9+8], INIT[3709*9+8], INIT[3708*9+8], + INIT[3707*9+8], INIT[3706*9+8], INIT[3705*9+8], INIT[3704*9+8], + INIT[3703*9+8], INIT[3702*9+8], INIT[3701*9+8], INIT[3700*9+8], + INIT[3699*9+8], INIT[3698*9+8], INIT[3697*9+8], INIT[3696*9+8], + INIT[3695*9+8], INIT[3694*9+8], INIT[3693*9+8], INIT[3692*9+8], + INIT[3691*9+8], INIT[3690*9+8], INIT[3689*9+8], INIT[3688*9+8], + INIT[3687*9+8], INIT[3686*9+8], INIT[3685*9+8], INIT[3684*9+8], + INIT[3683*9+8], INIT[3682*9+8], INIT[3681*9+8], INIT[3680*9+8], + INIT[3679*9+8], INIT[3678*9+8], INIT[3677*9+8], INIT[3676*9+8], + INIT[3675*9+8], INIT[3674*9+8], INIT[3673*9+8], INIT[3672*9+8], + INIT[3671*9+8], INIT[3670*9+8], INIT[3669*9+8], INIT[3668*9+8], + INIT[3667*9+8], INIT[3666*9+8], INIT[3665*9+8], INIT[3664*9+8], + INIT[3663*9+8], INIT[3662*9+8], INIT[3661*9+8], INIT[3660*9+8], + INIT[3659*9+8], INIT[3658*9+8], INIT[3657*9+8], INIT[3656*9+8], + INIT[3655*9+8], INIT[3654*9+8], INIT[3653*9+8], INIT[3652*9+8], + INIT[3651*9+8], INIT[3650*9+8], INIT[3649*9+8], INIT[3648*9+8], + INIT[3647*9+8], INIT[3646*9+8], INIT[3645*9+8], INIT[3644*9+8], + INIT[3643*9+8], INIT[3642*9+8], INIT[3641*9+8], INIT[3640*9+8], + INIT[3639*9+8], INIT[3638*9+8], INIT[3637*9+8], INIT[3636*9+8], + INIT[3635*9+8], INIT[3634*9+8], INIT[3633*9+8], INIT[3632*9+8], + INIT[3631*9+8], INIT[3630*9+8], INIT[3629*9+8], INIT[3628*9+8], + INIT[3627*9+8], INIT[3626*9+8], INIT[3625*9+8], INIT[3624*9+8], + INIT[3623*9+8], INIT[3622*9+8], INIT[3621*9+8], INIT[3620*9+8], + INIT[3619*9+8], INIT[3618*9+8], INIT[3617*9+8], INIT[3616*9+8], + INIT[3615*9+8], INIT[3614*9+8], INIT[3613*9+8], INIT[3612*9+8], + INIT[3611*9+8], INIT[3610*9+8], INIT[3609*9+8], INIT[3608*9+8], + INIT[3607*9+8], INIT[3606*9+8], INIT[3605*9+8], INIT[3604*9+8], + INIT[3603*9+8], INIT[3602*9+8], INIT[3601*9+8], INIT[3600*9+8], + INIT[3599*9+8], INIT[3598*9+8], INIT[3597*9+8], INIT[3596*9+8], + INIT[3595*9+8], INIT[3594*9+8], INIT[3593*9+8], INIT[3592*9+8], + INIT[3591*9+8], INIT[3590*9+8], INIT[3589*9+8], INIT[3588*9+8], + INIT[3587*9+8], INIT[3586*9+8], INIT[3585*9+8], INIT[3584*9+8]}), +.INITP_0F({INIT[4095*9+8], INIT[4094*9+8], INIT[4093*9+8], INIT[4092*9+8], + INIT[4091*9+8], INIT[4090*9+8], INIT[4089*9+8], INIT[4088*9+8], + INIT[4087*9+8], INIT[4086*9+8], INIT[4085*9+8], INIT[4084*9+8], + INIT[4083*9+8], INIT[4082*9+8], INIT[4081*9+8], INIT[4080*9+8], + INIT[4079*9+8], INIT[4078*9+8], INIT[4077*9+8], INIT[4076*9+8], + INIT[4075*9+8], INIT[4074*9+8], INIT[4073*9+8], INIT[4072*9+8], + INIT[4071*9+8], INIT[4070*9+8], INIT[4069*9+8], INIT[4068*9+8], + INIT[4067*9+8], INIT[4066*9+8], INIT[4065*9+8], INIT[4064*9+8], + INIT[4063*9+8], INIT[4062*9+8], INIT[4061*9+8], INIT[4060*9+8], + INIT[4059*9+8], INIT[4058*9+8], INIT[4057*9+8], INIT[4056*9+8], + INIT[4055*9+8], INIT[4054*9+8], INIT[4053*9+8], INIT[4052*9+8], + INIT[4051*9+8], INIT[4050*9+8], INIT[4049*9+8], INIT[4048*9+8], + INIT[4047*9+8], INIT[4046*9+8], INIT[4045*9+8], INIT[4044*9+8], + INIT[4043*9+8], INIT[4042*9+8], INIT[4041*9+8], INIT[4040*9+8], + INIT[4039*9+8], INIT[4038*9+8], INIT[4037*9+8], INIT[4036*9+8], + INIT[4035*9+8], INIT[4034*9+8], INIT[4033*9+8], INIT[4032*9+8], + INIT[4031*9+8], INIT[4030*9+8], INIT[4029*9+8], INIT[4028*9+8], + INIT[4027*9+8], INIT[4026*9+8], INIT[4025*9+8], INIT[4024*9+8], + INIT[4023*9+8], INIT[4022*9+8], INIT[4021*9+8], INIT[4020*9+8], + INIT[4019*9+8], INIT[4018*9+8], INIT[4017*9+8], INIT[4016*9+8], + INIT[4015*9+8], INIT[4014*9+8], INIT[4013*9+8], INIT[4012*9+8], + INIT[4011*9+8], INIT[4010*9+8], INIT[4009*9+8], INIT[4008*9+8], + INIT[4007*9+8], INIT[4006*9+8], INIT[4005*9+8], INIT[4004*9+8], + INIT[4003*9+8], INIT[4002*9+8], INIT[4001*9+8], INIT[4000*9+8], + INIT[3999*9+8], INIT[3998*9+8], INIT[3997*9+8], INIT[3996*9+8], + INIT[3995*9+8], INIT[3994*9+8], INIT[3993*9+8], INIT[3992*9+8], + INIT[3991*9+8], INIT[3990*9+8], INIT[3989*9+8], INIT[3988*9+8], + INIT[3987*9+8], INIT[3986*9+8], INIT[3985*9+8], INIT[3984*9+8], + INIT[3983*9+8], INIT[3982*9+8], INIT[3981*9+8], INIT[3980*9+8], + INIT[3979*9+8], INIT[3978*9+8], INIT[3977*9+8], INIT[3976*9+8], + INIT[3975*9+8], INIT[3974*9+8], INIT[3973*9+8], INIT[3972*9+8], + INIT[3971*9+8], INIT[3970*9+8], INIT[3969*9+8], INIT[3968*9+8], + INIT[3967*9+8], INIT[3966*9+8], INIT[3965*9+8], INIT[3964*9+8], + INIT[3963*9+8], INIT[3962*9+8], INIT[3961*9+8], INIT[3960*9+8], + INIT[3959*9+8], INIT[3958*9+8], INIT[3957*9+8], INIT[3956*9+8], + INIT[3955*9+8], INIT[3954*9+8], INIT[3953*9+8], INIT[3952*9+8], + INIT[3951*9+8], INIT[3950*9+8], INIT[3949*9+8], INIT[3948*9+8], + INIT[3947*9+8], INIT[3946*9+8], INIT[3945*9+8], INIT[3944*9+8], + INIT[3943*9+8], INIT[3942*9+8], INIT[3941*9+8], INIT[3940*9+8], + INIT[3939*9+8], INIT[3938*9+8], INIT[3937*9+8], INIT[3936*9+8], + INIT[3935*9+8], INIT[3934*9+8], INIT[3933*9+8], INIT[3932*9+8], + INIT[3931*9+8], INIT[3930*9+8], INIT[3929*9+8], INIT[3928*9+8], + INIT[3927*9+8], INIT[3926*9+8], INIT[3925*9+8], INIT[3924*9+8], + INIT[3923*9+8], INIT[3922*9+8], INIT[3921*9+8], INIT[3920*9+8], + INIT[3919*9+8], INIT[3918*9+8], INIT[3917*9+8], INIT[3916*9+8], + INIT[3915*9+8], INIT[3914*9+8], INIT[3913*9+8], INIT[3912*9+8], + INIT[3911*9+8], INIT[3910*9+8], INIT[3909*9+8], INIT[3908*9+8], + INIT[3907*9+8], INIT[3906*9+8], INIT[3905*9+8], INIT[3904*9+8], + INIT[3903*9+8], INIT[3902*9+8], INIT[3901*9+8], INIT[3900*9+8], + INIT[3899*9+8], INIT[3898*9+8], INIT[3897*9+8], INIT[3896*9+8], + INIT[3895*9+8], INIT[3894*9+8], INIT[3893*9+8], INIT[3892*9+8], + INIT[3891*9+8], INIT[3890*9+8], INIT[3889*9+8], INIT[3888*9+8], + INIT[3887*9+8], INIT[3886*9+8], INIT[3885*9+8], INIT[3884*9+8], + INIT[3883*9+8], INIT[3882*9+8], INIT[3881*9+8], INIT[3880*9+8], + INIT[3879*9+8], INIT[3878*9+8], INIT[3877*9+8], INIT[3876*9+8], + INIT[3875*9+8], INIT[3874*9+8], INIT[3873*9+8], INIT[3872*9+8], + INIT[3871*9+8], INIT[3870*9+8], INIT[3869*9+8], INIT[3868*9+8], + INIT[3867*9+8], INIT[3866*9+8], INIT[3865*9+8], INIT[3864*9+8], + INIT[3863*9+8], INIT[3862*9+8], INIT[3861*9+8], INIT[3860*9+8], + INIT[3859*9+8], INIT[3858*9+8], INIT[3857*9+8], INIT[3856*9+8], + INIT[3855*9+8], INIT[3854*9+8], INIT[3853*9+8], INIT[3852*9+8], + INIT[3851*9+8], INIT[3850*9+8], INIT[3849*9+8], INIT[3848*9+8], + INIT[3847*9+8], INIT[3846*9+8], INIT[3845*9+8], INIT[3844*9+8], + INIT[3843*9+8], INIT[3842*9+8], INIT[3841*9+8], INIT[3840*9+8]}), +.INIT_00({INIT[ 31*9 +: 8], INIT[ 30*9 +: 8], INIT[ 29*9 +: 8], INIT[ 28*9 +: 8], + INIT[ 27*9 +: 8], INIT[ 26*9 +: 8], INIT[ 25*9 +: 8], INIT[ 24*9 +: 8], + INIT[ 23*9 +: 8], INIT[ 22*9 +: 8], INIT[ 21*9 +: 8], INIT[ 20*9 +: 8], + INIT[ 19*9 +: 8], INIT[ 18*9 +: 8], INIT[ 17*9 +: 8], INIT[ 16*9 +: 8], + INIT[ 15*9 +: 8], INIT[ 14*9 +: 8], INIT[ 13*9 +: 8], INIT[ 12*9 +: 8], + INIT[ 11*9 +: 8], INIT[ 10*9 +: 8], INIT[ 9*9 +: 8], INIT[ 8*9 +: 8], + INIT[ 7*9 +: 8], INIT[ 6*9 +: 8], INIT[ 5*9 +: 8], INIT[ 4*9 +: 8], + INIT[ 3*9 +: 8], INIT[ 2*9 +: 8], INIT[ 1*9 +: 8], INIT[ 0*9 +: 8]}), +.INIT_01({INIT[ 63*9 +: 8], INIT[ 62*9 +: 8], INIT[ 61*9 +: 8], INIT[ 60*9 +: 8], + INIT[ 59*9 +: 8], INIT[ 58*9 +: 8], INIT[ 57*9 +: 8], INIT[ 56*9 +: 8], + INIT[ 55*9 +: 8], INIT[ 54*9 +: 8], INIT[ 53*9 +: 8], INIT[ 52*9 +: 8], + INIT[ 51*9 +: 8], INIT[ 50*9 +: 8], INIT[ 49*9 +: 8], INIT[ 48*9 +: 8], + INIT[ 47*9 +: 8], INIT[ 46*9 +: 8], INIT[ 45*9 +: 8], INIT[ 44*9 +: 8], + INIT[ 43*9 +: 8], INIT[ 42*9 +: 8], INIT[ 41*9 +: 8], INIT[ 40*9 +: 8], + INIT[ 39*9 +: 8], INIT[ 38*9 +: 8], INIT[ 37*9 +: 8], INIT[ 36*9 +: 8], + INIT[ 35*9 +: 8], INIT[ 34*9 +: 8], INIT[ 33*9 +: 8], INIT[ 32*9 +: 8]}), +.INIT_02({INIT[ 95*9 +: 8], INIT[ 94*9 +: 8], INIT[ 93*9 +: 8], INIT[ 92*9 +: 8], + INIT[ 91*9 +: 8], INIT[ 90*9 +: 8], INIT[ 89*9 +: 8], INIT[ 88*9 +: 8], + INIT[ 87*9 +: 8], INIT[ 86*9 +: 8], INIT[ 85*9 +: 8], INIT[ 84*9 +: 8], + INIT[ 83*9 +: 8], INIT[ 82*9 +: 8], INIT[ 81*9 +: 8], INIT[ 80*9 +: 8], + INIT[ 79*9 +: 8], INIT[ 78*9 +: 8], INIT[ 77*9 +: 8], INIT[ 76*9 +: 8], + INIT[ 75*9 +: 8], INIT[ 74*9 +: 8], INIT[ 73*9 +: 8], INIT[ 72*9 +: 8], + INIT[ 71*9 +: 8], INIT[ 70*9 +: 8], INIT[ 69*9 +: 8], INIT[ 68*9 +: 8], + INIT[ 67*9 +: 8], INIT[ 66*9 +: 8], INIT[ 65*9 +: 8], INIT[ 64*9 +: 8]}), +.INIT_03({INIT[127*9 +: 8], INIT[126*9 +: 8], INIT[125*9 +: 8], INIT[124*9 +: 8], + INIT[123*9 +: 8], INIT[122*9 +: 8], INIT[121*9 +: 8], INIT[120*9 +: 8], + INIT[119*9 +: 8], INIT[118*9 +: 8], INIT[117*9 +: 8], INIT[116*9 +: 8], + INIT[115*9 +: 8], INIT[114*9 +: 8], INIT[113*9 +: 8], INIT[112*9 +: 8], + INIT[111*9 +: 8], INIT[110*9 +: 8], INIT[109*9 +: 8], INIT[108*9 +: 8], + INIT[107*9 +: 8], INIT[106*9 +: 8], INIT[105*9 +: 8], INIT[104*9 +: 8], + INIT[103*9 +: 8], INIT[102*9 +: 8], INIT[101*9 +: 8], INIT[100*9 +: 8], + INIT[ 99*9 +: 8], INIT[ 98*9 +: 8], INIT[ 97*9 +: 8], INIT[ 96*9 +: 8]}), +.INIT_04({INIT[159*9 +: 8], INIT[158*9 +: 8], INIT[157*9 +: 8], INIT[156*9 +: 8], + INIT[155*9 +: 8], INIT[154*9 +: 8], INIT[153*9 +: 8], INIT[152*9 +: 8], + INIT[151*9 +: 8], INIT[150*9 +: 8], INIT[149*9 +: 8], INIT[148*9 +: 8], + INIT[147*9 +: 8], INIT[146*9 +: 8], INIT[145*9 +: 8], INIT[144*9 +: 8], + INIT[143*9 +: 8], INIT[142*9 +: 8], INIT[141*9 +: 8], INIT[140*9 +: 8], + INIT[139*9 +: 8], INIT[138*9 +: 8], INIT[137*9 +: 8], INIT[136*9 +: 8], + INIT[135*9 +: 8], INIT[134*9 +: 8], INIT[133*9 +: 8], INIT[132*9 +: 8], + INIT[131*9 +: 8], INIT[130*9 +: 8], INIT[129*9 +: 8], INIT[128*9 +: 8]}), +.INIT_05({INIT[191*9 +: 8], INIT[190*9 +: 8], INIT[189*9 +: 8], INIT[188*9 +: 8], + INIT[187*9 +: 8], INIT[186*9 +: 8], INIT[185*9 +: 8], INIT[184*9 +: 8], + INIT[183*9 +: 8], INIT[182*9 +: 8], INIT[181*9 +: 8], INIT[180*9 +: 8], + INIT[179*9 +: 8], INIT[178*9 +: 8], INIT[177*9 +: 8], INIT[176*9 +: 8], + INIT[175*9 +: 8], INIT[174*9 +: 8], INIT[173*9 +: 8], INIT[172*9 +: 8], + INIT[171*9 +: 8], INIT[170*9 +: 8], INIT[169*9 +: 8], INIT[168*9 +: 8], + INIT[167*9 +: 8], INIT[166*9 +: 8], INIT[165*9 +: 8], INIT[164*9 +: 8], + INIT[163*9 +: 8], INIT[162*9 +: 8], INIT[161*9 +: 8], INIT[160*9 +: 8]}), +.INIT_06({INIT[223*9 +: 8], INIT[222*9 +: 8], INIT[221*9 +: 8], INIT[220*9 +: 8], + INIT[219*9 +: 8], INIT[218*9 +: 8], INIT[217*9 +: 8], INIT[216*9 +: 8], + INIT[215*9 +: 8], INIT[214*9 +: 8], INIT[213*9 +: 8], INIT[212*9 +: 8], + INIT[211*9 +: 8], INIT[210*9 +: 8], INIT[209*9 +: 8], INIT[208*9 +: 8], + INIT[207*9 +: 8], INIT[206*9 +: 8], INIT[205*9 +: 8], INIT[204*9 +: 8], + INIT[203*9 +: 8], INIT[202*9 +: 8], INIT[201*9 +: 8], INIT[200*9 +: 8], + INIT[199*9 +: 8], INIT[198*9 +: 8], INIT[197*9 +: 8], INIT[196*9 +: 8], + INIT[195*9 +: 8], INIT[194*9 +: 8], INIT[193*9 +: 8], INIT[192*9 +: 8]}), +.INIT_07({INIT[255*9 +: 8], INIT[254*9 +: 8], INIT[253*9 +: 8], INIT[252*9 +: 8], + INIT[251*9 +: 8], INIT[250*9 +: 8], INIT[249*9 +: 8], INIT[248*9 +: 8], + INIT[247*9 +: 8], INIT[246*9 +: 8], INIT[245*9 +: 8], INIT[244*9 +: 8], + INIT[243*9 +: 8], INIT[242*9 +: 8], INIT[241*9 +: 8], INIT[240*9 +: 8], + INIT[239*9 +: 8], INIT[238*9 +: 8], INIT[237*9 +: 8], INIT[236*9 +: 8], + INIT[235*9 +: 8], INIT[234*9 +: 8], INIT[233*9 +: 8], INIT[232*9 +: 8], + INIT[231*9 +: 8], INIT[230*9 +: 8], INIT[229*9 +: 8], INIT[228*9 +: 8], + INIT[227*9 +: 8], INIT[226*9 +: 8], INIT[225*9 +: 8], INIT[224*9 +: 8]}), +.INIT_08({INIT[287*9 +: 8], INIT[286*9 +: 8], INIT[285*9 +: 8], INIT[284*9 +: 8], + INIT[283*9 +: 8], INIT[282*9 +: 8], INIT[281*9 +: 8], INIT[280*9 +: 8], + INIT[279*9 +: 8], INIT[278*9 +: 8], INIT[277*9 +: 8], INIT[276*9 +: 8], + INIT[275*9 +: 8], INIT[274*9 +: 8], INIT[273*9 +: 8], INIT[272*9 +: 8], + INIT[271*9 +: 8], INIT[270*9 +: 8], INIT[269*9 +: 8], INIT[268*9 +: 8], + INIT[267*9 +: 8], INIT[266*9 +: 8], INIT[265*9 +: 8], INIT[264*9 +: 8], + INIT[263*9 +: 8], INIT[262*9 +: 8], INIT[261*9 +: 8], INIT[260*9 +: 8], + INIT[259*9 +: 8], INIT[258*9 +: 8], INIT[257*9 +: 8], INIT[256*9 +: 8]}), +.INIT_09({INIT[319*9 +: 8], INIT[318*9 +: 8], INIT[317*9 +: 8], INIT[316*9 +: 8], + INIT[315*9 +: 8], INIT[314*9 +: 8], INIT[313*9 +: 8], INIT[312*9 +: 8], + INIT[311*9 +: 8], INIT[310*9 +: 8], INIT[309*9 +: 8], INIT[308*9 +: 8], + INIT[307*9 +: 8], INIT[306*9 +: 8], INIT[305*9 +: 8], INIT[304*9 +: 8], + INIT[303*9 +: 8], INIT[302*9 +: 8], INIT[301*9 +: 8], INIT[300*9 +: 8], + INIT[299*9 +: 8], INIT[298*9 +: 8], INIT[297*9 +: 8], INIT[296*9 +: 8], + INIT[295*9 +: 8], INIT[294*9 +: 8], INIT[293*9 +: 8], INIT[292*9 +: 8], + INIT[291*9 +: 8], INIT[290*9 +: 8], INIT[289*9 +: 8], INIT[288*9 +: 8]}), +.INIT_0A({INIT[351*9 +: 8], INIT[350*9 +: 8], INIT[349*9 +: 8], INIT[348*9 +: 8], + INIT[347*9 +: 8], INIT[346*9 +: 8], INIT[345*9 +: 8], INIT[344*9 +: 8], + INIT[343*9 +: 8], INIT[342*9 +: 8], INIT[341*9 +: 8], INIT[340*9 +: 8], + INIT[339*9 +: 8], INIT[338*9 +: 8], INIT[337*9 +: 8], INIT[336*9 +: 8], + INIT[335*9 +: 8], INIT[334*9 +: 8], INIT[333*9 +: 8], INIT[332*9 +: 8], + INIT[331*9 +: 8], INIT[330*9 +: 8], INIT[329*9 +: 8], INIT[328*9 +: 8], + INIT[327*9 +: 8], INIT[326*9 +: 8], INIT[325*9 +: 8], INIT[324*9 +: 8], + INIT[323*9 +: 8], INIT[322*9 +: 8], INIT[321*9 +: 8], INIT[320*9 +: 8]}), +.INIT_0B({INIT[383*9 +: 8], INIT[382*9 +: 8], INIT[381*9 +: 8], INIT[380*9 +: 8], + INIT[379*9 +: 8], INIT[378*9 +: 8], INIT[377*9 +: 8], INIT[376*9 +: 8], + INIT[375*9 +: 8], INIT[374*9 +: 8], INIT[373*9 +: 8], INIT[372*9 +: 8], + INIT[371*9 +: 8], INIT[370*9 +: 8], INIT[369*9 +: 8], INIT[368*9 +: 8], + INIT[367*9 +: 8], INIT[366*9 +: 8], INIT[365*9 +: 8], INIT[364*9 +: 8], + INIT[363*9 +: 8], INIT[362*9 +: 8], INIT[361*9 +: 8], INIT[360*9 +: 8], + INIT[359*9 +: 8], INIT[358*9 +: 8], INIT[357*9 +: 8], INIT[356*9 +: 8], + INIT[355*9 +: 8], INIT[354*9 +: 8], INIT[353*9 +: 8], INIT[352*9 +: 8]}), +.INIT_0C({INIT[415*9 +: 8], INIT[414*9 +: 8], INIT[413*9 +: 8], INIT[412*9 +: 8], + INIT[411*9 +: 8], INIT[410*9 +: 8], INIT[409*9 +: 8], INIT[408*9 +: 8], + INIT[407*9 +: 8], INIT[406*9 +: 8], INIT[405*9 +: 8], INIT[404*9 +: 8], + INIT[403*9 +: 8], INIT[402*9 +: 8], INIT[401*9 +: 8], INIT[400*9 +: 8], + INIT[399*9 +: 8], INIT[398*9 +: 8], INIT[397*9 +: 8], INIT[396*9 +: 8], + INIT[395*9 +: 8], INIT[394*9 +: 8], INIT[393*9 +: 8], INIT[392*9 +: 8], + INIT[391*9 +: 8], INIT[390*9 +: 8], INIT[389*9 +: 8], INIT[388*9 +: 8], + INIT[387*9 +: 8], INIT[386*9 +: 8], INIT[385*9 +: 8], INIT[384*9 +: 8]}), +.INIT_0D({INIT[447*9 +: 8], INIT[446*9 +: 8], INIT[445*9 +: 8], INIT[444*9 +: 8], + INIT[443*9 +: 8], INIT[442*9 +: 8], INIT[441*9 +: 8], INIT[440*9 +: 8], + INIT[439*9 +: 8], INIT[438*9 +: 8], INIT[437*9 +: 8], INIT[436*9 +: 8], + INIT[435*9 +: 8], INIT[434*9 +: 8], INIT[433*9 +: 8], INIT[432*9 +: 8], + INIT[431*9 +: 8], INIT[430*9 +: 8], INIT[429*9 +: 8], INIT[428*9 +: 8], + INIT[427*9 +: 8], INIT[426*9 +: 8], INIT[425*9 +: 8], INIT[424*9 +: 8], + INIT[423*9 +: 8], INIT[422*9 +: 8], INIT[421*9 +: 8], INIT[420*9 +: 8], + INIT[419*9 +: 8], INIT[418*9 +: 8], INIT[417*9 +: 8], INIT[416*9 +: 8]}), +.INIT_0E({INIT[479*9 +: 8], INIT[478*9 +: 8], INIT[477*9 +: 8], INIT[476*9 +: 8], + INIT[475*9 +: 8], INIT[474*9 +: 8], INIT[473*9 +: 8], INIT[472*9 +: 8], + INIT[471*9 +: 8], INIT[470*9 +: 8], INIT[469*9 +: 8], INIT[468*9 +: 8], + INIT[467*9 +: 8], INIT[466*9 +: 8], INIT[465*9 +: 8], INIT[464*9 +: 8], + INIT[463*9 +: 8], INIT[462*9 +: 8], INIT[461*9 +: 8], INIT[460*9 +: 8], + INIT[459*9 +: 8], INIT[458*9 +: 8], INIT[457*9 +: 8], INIT[456*9 +: 8], + INIT[455*9 +: 8], INIT[454*9 +: 8], INIT[453*9 +: 8], INIT[452*9 +: 8], + INIT[451*9 +: 8], INIT[450*9 +: 8], INIT[449*9 +: 8], INIT[448*9 +: 8]}), +.INIT_0F({INIT[511*9 +: 8], INIT[510*9 +: 8], INIT[509*9 +: 8], INIT[508*9 +: 8], + INIT[507*9 +: 8], INIT[506*9 +: 8], INIT[505*9 +: 8], INIT[504*9 +: 8], + INIT[503*9 +: 8], INIT[502*9 +: 8], INIT[501*9 +: 8], INIT[500*9 +: 8], + INIT[499*9 +: 8], INIT[498*9 +: 8], INIT[497*9 +: 8], INIT[496*9 +: 8], + INIT[495*9 +: 8], INIT[494*9 +: 8], INIT[493*9 +: 8], INIT[492*9 +: 8], + INIT[491*9 +: 8], INIT[490*9 +: 8], INIT[489*9 +: 8], INIT[488*9 +: 8], + INIT[487*9 +: 8], INIT[486*9 +: 8], INIT[485*9 +: 8], INIT[484*9 +: 8], + INIT[483*9 +: 8], INIT[482*9 +: 8], INIT[481*9 +: 8], INIT[480*9 +: 8]}), +.INIT_10({INIT[543*9 +: 8], INIT[542*9 +: 8], INIT[541*9 +: 8], INIT[540*9 +: 8], + INIT[539*9 +: 8], INIT[538*9 +: 8], INIT[537*9 +: 8], INIT[536*9 +: 8], + INIT[535*9 +: 8], INIT[534*9 +: 8], INIT[533*9 +: 8], INIT[532*9 +: 8], + INIT[531*9 +: 8], INIT[530*9 +: 8], INIT[529*9 +: 8], INIT[528*9 +: 8], + INIT[527*9 +: 8], INIT[526*9 +: 8], INIT[525*9 +: 8], INIT[524*9 +: 8], + INIT[523*9 +: 8], INIT[522*9 +: 8], INIT[521*9 +: 8], INIT[520*9 +: 8], + INIT[519*9 +: 8], INIT[518*9 +: 8], INIT[517*9 +: 8], INIT[516*9 +: 8], + INIT[515*9 +: 8], INIT[514*9 +: 8], INIT[513*9 +: 8], INIT[512*9 +: 8]}), +.INIT_11({INIT[575*9 +: 8], INIT[574*9 +: 8], INIT[573*9 +: 8], INIT[572*9 +: 8], + INIT[571*9 +: 8], INIT[570*9 +: 8], INIT[569*9 +: 8], INIT[568*9 +: 8], + INIT[567*9 +: 8], INIT[566*9 +: 8], INIT[565*9 +: 8], INIT[564*9 +: 8], + INIT[563*9 +: 8], INIT[562*9 +: 8], INIT[561*9 +: 8], INIT[560*9 +: 8], + INIT[559*9 +: 8], INIT[558*9 +: 8], INIT[557*9 +: 8], INIT[556*9 +: 8], + INIT[555*9 +: 8], INIT[554*9 +: 8], INIT[553*9 +: 8], INIT[552*9 +: 8], + INIT[551*9 +: 8], INIT[550*9 +: 8], INIT[549*9 +: 8], INIT[548*9 +: 8], + INIT[547*9 +: 8], INIT[546*9 +: 8], INIT[545*9 +: 8], INIT[544*9 +: 8]}), +.INIT_12({INIT[607*9 +: 8], INIT[606*9 +: 8], INIT[605*9 +: 8], INIT[604*9 +: 8], + INIT[603*9 +: 8], INIT[602*9 +: 8], INIT[601*9 +: 8], INIT[600*9 +: 8], + INIT[599*9 +: 8], INIT[598*9 +: 8], INIT[597*9 +: 8], INIT[596*9 +: 8], + INIT[595*9 +: 8], INIT[594*9 +: 8], INIT[593*9 +: 8], INIT[592*9 +: 8], + INIT[591*9 +: 8], INIT[590*9 +: 8], INIT[589*9 +: 8], INIT[588*9 +: 8], + INIT[587*9 +: 8], INIT[586*9 +: 8], INIT[585*9 +: 8], INIT[584*9 +: 8], + INIT[583*9 +: 8], INIT[582*9 +: 8], INIT[581*9 +: 8], INIT[580*9 +: 8], + INIT[579*9 +: 8], INIT[578*9 +: 8], INIT[577*9 +: 8], INIT[576*9 +: 8]}), +.INIT_13({INIT[639*9 +: 8], INIT[638*9 +: 8], INIT[637*9 +: 8], INIT[636*9 +: 8], + INIT[635*9 +: 8], INIT[634*9 +: 8], INIT[633*9 +: 8], INIT[632*9 +: 8], + INIT[631*9 +: 8], INIT[630*9 +: 8], INIT[629*9 +: 8], INIT[628*9 +: 8], + INIT[627*9 +: 8], INIT[626*9 +: 8], INIT[625*9 +: 8], INIT[624*9 +: 8], + INIT[623*9 +: 8], INIT[622*9 +: 8], INIT[621*9 +: 8], INIT[620*9 +: 8], + INIT[619*9 +: 8], INIT[618*9 +: 8], INIT[617*9 +: 8], INIT[616*9 +: 8], + INIT[615*9 +: 8], INIT[614*9 +: 8], INIT[613*9 +: 8], INIT[612*9 +: 8], + INIT[611*9 +: 8], INIT[610*9 +: 8], INIT[609*9 +: 8], INIT[608*9 +: 8]}), +.INIT_14({INIT[671*9 +: 8], INIT[670*9 +: 8], INIT[669*9 +: 8], INIT[668*9 +: 8], + INIT[667*9 +: 8], INIT[666*9 +: 8], INIT[665*9 +: 8], INIT[664*9 +: 8], + INIT[663*9 +: 8], INIT[662*9 +: 8], INIT[661*9 +: 8], INIT[660*9 +: 8], + INIT[659*9 +: 8], INIT[658*9 +: 8], INIT[657*9 +: 8], INIT[656*9 +: 8], + INIT[655*9 +: 8], INIT[654*9 +: 8], INIT[653*9 +: 8], INIT[652*9 +: 8], + INIT[651*9 +: 8], INIT[650*9 +: 8], INIT[649*9 +: 8], INIT[648*9 +: 8], + INIT[647*9 +: 8], INIT[646*9 +: 8], INIT[645*9 +: 8], INIT[644*9 +: 8], + INIT[643*9 +: 8], INIT[642*9 +: 8], INIT[641*9 +: 8], INIT[640*9 +: 8]}), +.INIT_15({INIT[703*9 +: 8], INIT[702*9 +: 8], INIT[701*9 +: 8], INIT[700*9 +: 8], + INIT[699*9 +: 8], INIT[698*9 +: 8], INIT[697*9 +: 8], INIT[696*9 +: 8], + INIT[695*9 +: 8], INIT[694*9 +: 8], INIT[693*9 +: 8], INIT[692*9 +: 8], + INIT[691*9 +: 8], INIT[690*9 +: 8], INIT[689*9 +: 8], INIT[688*9 +: 8], + INIT[687*9 +: 8], INIT[686*9 +: 8], INIT[685*9 +: 8], INIT[684*9 +: 8], + INIT[683*9 +: 8], INIT[682*9 +: 8], INIT[681*9 +: 8], INIT[680*9 +: 8], + INIT[679*9 +: 8], INIT[678*9 +: 8], INIT[677*9 +: 8], INIT[676*9 +: 8], + INIT[675*9 +: 8], INIT[674*9 +: 8], INIT[673*9 +: 8], INIT[672*9 +: 8]}), +.INIT_16({INIT[735*9 +: 8], INIT[734*9 +: 8], INIT[733*9 +: 8], INIT[732*9 +: 8], + INIT[731*9 +: 8], INIT[730*9 +: 8], INIT[729*9 +: 8], INIT[728*9 +: 8], + INIT[727*9 +: 8], INIT[726*9 +: 8], INIT[725*9 +: 8], INIT[724*9 +: 8], + INIT[723*9 +: 8], INIT[722*9 +: 8], INIT[721*9 +: 8], INIT[720*9 +: 8], + INIT[719*9 +: 8], INIT[718*9 +: 8], INIT[717*9 +: 8], INIT[716*9 +: 8], + INIT[715*9 +: 8], INIT[714*9 +: 8], INIT[713*9 +: 8], INIT[712*9 +: 8], + INIT[711*9 +: 8], INIT[710*9 +: 8], INIT[709*9 +: 8], INIT[708*9 +: 8], + INIT[707*9 +: 8], INIT[706*9 +: 8], INIT[705*9 +: 8], INIT[704*9 +: 8]}), +.INIT_17({INIT[767*9 +: 8], INIT[766*9 +: 8], INIT[765*9 +: 8], INIT[764*9 +: 8], + INIT[763*9 +: 8], INIT[762*9 +: 8], INIT[761*9 +: 8], INIT[760*9 +: 8], + INIT[759*9 +: 8], INIT[758*9 +: 8], INIT[757*9 +: 8], INIT[756*9 +: 8], + INIT[755*9 +: 8], INIT[754*9 +: 8], INIT[753*9 +: 8], INIT[752*9 +: 8], + INIT[751*9 +: 8], INIT[750*9 +: 8], INIT[749*9 +: 8], INIT[748*9 +: 8], + INIT[747*9 +: 8], INIT[746*9 +: 8], INIT[745*9 +: 8], INIT[744*9 +: 8], + INIT[743*9 +: 8], INIT[742*9 +: 8], INIT[741*9 +: 8], INIT[740*9 +: 8], + INIT[739*9 +: 8], INIT[738*9 +: 8], INIT[737*9 +: 8], INIT[736*9 +: 8]}), +.INIT_18({INIT[799*9 +: 8], INIT[798*9 +: 8], INIT[797*9 +: 8], INIT[796*9 +: 8], + INIT[795*9 +: 8], INIT[794*9 +: 8], INIT[793*9 +: 8], INIT[792*9 +: 8], + INIT[791*9 +: 8], INIT[790*9 +: 8], INIT[789*9 +: 8], INIT[788*9 +: 8], + INIT[787*9 +: 8], INIT[786*9 +: 8], INIT[785*9 +: 8], INIT[784*9 +: 8], + INIT[783*9 +: 8], INIT[782*9 +: 8], INIT[781*9 +: 8], INIT[780*9 +: 8], + INIT[779*9 +: 8], INIT[778*9 +: 8], INIT[777*9 +: 8], INIT[776*9 +: 8], + INIT[775*9 +: 8], INIT[774*9 +: 8], INIT[773*9 +: 8], INIT[772*9 +: 8], + INIT[771*9 +: 8], INIT[770*9 +: 8], INIT[769*9 +: 8], INIT[768*9 +: 8]}), +.INIT_19({INIT[831*9 +: 8], INIT[830*9 +: 8], INIT[829*9 +: 8], INIT[828*9 +: 8], + INIT[827*9 +: 8], INIT[826*9 +: 8], INIT[825*9 +: 8], INIT[824*9 +: 8], + INIT[823*9 +: 8], INIT[822*9 +: 8], INIT[821*9 +: 8], INIT[820*9 +: 8], + INIT[819*9 +: 8], INIT[818*9 +: 8], INIT[817*9 +: 8], INIT[816*9 +: 8], + INIT[815*9 +: 8], INIT[814*9 +: 8], INIT[813*9 +: 8], INIT[812*9 +: 8], + INIT[811*9 +: 8], INIT[810*9 +: 8], INIT[809*9 +: 8], INIT[808*9 +: 8], + INIT[807*9 +: 8], INIT[806*9 +: 8], INIT[805*9 +: 8], INIT[804*9 +: 8], + INIT[803*9 +: 8], INIT[802*9 +: 8], INIT[801*9 +: 8], INIT[800*9 +: 8]}), +.INIT_1A({INIT[863*9 +: 8], INIT[862*9 +: 8], INIT[861*9 +: 8], INIT[860*9 +: 8], + INIT[859*9 +: 8], INIT[858*9 +: 8], INIT[857*9 +: 8], INIT[856*9 +: 8], + INIT[855*9 +: 8], INIT[854*9 +: 8], INIT[853*9 +: 8], INIT[852*9 +: 8], + INIT[851*9 +: 8], INIT[850*9 +: 8], INIT[849*9 +: 8], INIT[848*9 +: 8], + INIT[847*9 +: 8], INIT[846*9 +: 8], INIT[845*9 +: 8], INIT[844*9 +: 8], + INIT[843*9 +: 8], INIT[842*9 +: 8], INIT[841*9 +: 8], INIT[840*9 +: 8], + INIT[839*9 +: 8], INIT[838*9 +: 8], INIT[837*9 +: 8], INIT[836*9 +: 8], + INIT[835*9 +: 8], INIT[834*9 +: 8], INIT[833*9 +: 8], INIT[832*9 +: 8]}), +.INIT_1B({INIT[895*9 +: 8], INIT[894*9 +: 8], INIT[893*9 +: 8], INIT[892*9 +: 8], + INIT[891*9 +: 8], INIT[890*9 +: 8], INIT[889*9 +: 8], INIT[888*9 +: 8], + INIT[887*9 +: 8], INIT[886*9 +: 8], INIT[885*9 +: 8], INIT[884*9 +: 8], + INIT[883*9 +: 8], INIT[882*9 +: 8], INIT[881*9 +: 8], INIT[880*9 +: 8], + INIT[879*9 +: 8], INIT[878*9 +: 8], INIT[877*9 +: 8], INIT[876*9 +: 8], + INIT[875*9 +: 8], INIT[874*9 +: 8], INIT[873*9 +: 8], INIT[872*9 +: 8], + INIT[871*9 +: 8], INIT[870*9 +: 8], INIT[869*9 +: 8], INIT[868*9 +: 8], + INIT[867*9 +: 8], INIT[866*9 +: 8], INIT[865*9 +: 8], INIT[864*9 +: 8]}), +.INIT_1C({INIT[927*9 +: 8], INIT[926*9 +: 8], INIT[925*9 +: 8], INIT[924*9 +: 8], + INIT[923*9 +: 8], INIT[922*9 +: 8], INIT[921*9 +: 8], INIT[920*9 +: 8], + INIT[919*9 +: 8], INIT[918*9 +: 8], INIT[917*9 +: 8], INIT[916*9 +: 8], + INIT[915*9 +: 8], INIT[914*9 +: 8], INIT[913*9 +: 8], INIT[912*9 +: 8], + INIT[911*9 +: 8], INIT[910*9 +: 8], INIT[909*9 +: 8], INIT[908*9 +: 8], + INIT[907*9 +: 8], INIT[906*9 +: 8], INIT[905*9 +: 8], INIT[904*9 +: 8], + INIT[903*9 +: 8], INIT[902*9 +: 8], INIT[901*9 +: 8], INIT[900*9 +: 8], + INIT[899*9 +: 8], INIT[898*9 +: 8], INIT[897*9 +: 8], INIT[896*9 +: 8]}), +.INIT_1D({INIT[959*9 +: 8], INIT[958*9 +: 8], INIT[957*9 +: 8], INIT[956*9 +: 8], + INIT[955*9 +: 8], INIT[954*9 +: 8], INIT[953*9 +: 8], INIT[952*9 +: 8], + INIT[951*9 +: 8], INIT[950*9 +: 8], INIT[949*9 +: 8], INIT[948*9 +: 8], + INIT[947*9 +: 8], INIT[946*9 +: 8], INIT[945*9 +: 8], INIT[944*9 +: 8], + INIT[943*9 +: 8], INIT[942*9 +: 8], INIT[941*9 +: 8], INIT[940*9 +: 8], + INIT[939*9 +: 8], INIT[938*9 +: 8], INIT[937*9 +: 8], INIT[936*9 +: 8], + INIT[935*9 +: 8], INIT[934*9 +: 8], INIT[933*9 +: 8], INIT[932*9 +: 8], + INIT[931*9 +: 8], INIT[930*9 +: 8], INIT[929*9 +: 8], INIT[928*9 +: 8]}), +.INIT_1E({INIT[991*9 +: 8], INIT[990*9 +: 8], INIT[989*9 +: 8], INIT[988*9 +: 8], + INIT[987*9 +: 8], INIT[986*9 +: 8], INIT[985*9 +: 8], INIT[984*9 +: 8], + INIT[983*9 +: 8], INIT[982*9 +: 8], INIT[981*9 +: 8], INIT[980*9 +: 8], + INIT[979*9 +: 8], INIT[978*9 +: 8], INIT[977*9 +: 8], INIT[976*9 +: 8], + INIT[975*9 +: 8], INIT[974*9 +: 8], INIT[973*9 +: 8], INIT[972*9 +: 8], + INIT[971*9 +: 8], INIT[970*9 +: 8], INIT[969*9 +: 8], INIT[968*9 +: 8], + INIT[967*9 +: 8], INIT[966*9 +: 8], INIT[965*9 +: 8], INIT[964*9 +: 8], + INIT[963*9 +: 8], INIT[962*9 +: 8], INIT[961*9 +: 8], INIT[960*9 +: 8]}), +.INIT_1F({INIT[1023*9 +: 8], INIT[1022*9 +: 8], INIT[1021*9 +: 8], INIT[1020*9 +: 8], + INIT[1019*9 +: 8], INIT[1018*9 +: 8], INIT[1017*9 +: 8], INIT[1016*9 +: 8], + INIT[1015*9 +: 8], INIT[1014*9 +: 8], INIT[1013*9 +: 8], INIT[1012*9 +: 8], + INIT[1011*9 +: 8], INIT[1010*9 +: 8], INIT[1009*9 +: 8], INIT[1008*9 +: 8], + INIT[1007*9 +: 8], INIT[1006*9 +: 8], INIT[1005*9 +: 8], INIT[1004*9 +: 8], + INIT[1003*9 +: 8], INIT[1002*9 +: 8], INIT[1001*9 +: 8], INIT[1000*9 +: 8], + INIT[999*9 +: 8], INIT[998*9 +: 8], INIT[997*9 +: 8], INIT[996*9 +: 8], + INIT[995*9 +: 8], INIT[994*9 +: 8], INIT[993*9 +: 8], INIT[992*9 +: 8]}), +.INIT_20({INIT[1055*9 +: 8], INIT[1054*9 +: 8], INIT[1053*9 +: 8], INIT[1052*9 +: 8], + INIT[1051*9 +: 8], INIT[1050*9 +: 8], INIT[1049*9 +: 8], INIT[1048*9 +: 8], + INIT[1047*9 +: 8], INIT[1046*9 +: 8], INIT[1045*9 +: 8], INIT[1044*9 +: 8], + INIT[1043*9 +: 8], INIT[1042*9 +: 8], INIT[1041*9 +: 8], INIT[1040*9 +: 8], + INIT[1039*9 +: 8], INIT[1038*9 +: 8], INIT[1037*9 +: 8], INIT[1036*9 +: 8], + INIT[1035*9 +: 8], INIT[1034*9 +: 8], INIT[1033*9 +: 8], INIT[1032*9 +: 8], + INIT[1031*9 +: 8], INIT[1030*9 +: 8], INIT[1029*9 +: 8], INIT[1028*9 +: 8], + INIT[1027*9 +: 8], INIT[1026*9 +: 8], INIT[1025*9 +: 8], INIT[1024*9 +: 8]}), +.INIT_21({INIT[1087*9 +: 8], INIT[1086*9 +: 8], INIT[1085*9 +: 8], INIT[1084*9 +: 8], + INIT[1083*9 +: 8], INIT[1082*9 +: 8], INIT[1081*9 +: 8], INIT[1080*9 +: 8], + INIT[1079*9 +: 8], INIT[1078*9 +: 8], INIT[1077*9 +: 8], INIT[1076*9 +: 8], + INIT[1075*9 +: 8], INIT[1074*9 +: 8], INIT[1073*9 +: 8], INIT[1072*9 +: 8], + INIT[1071*9 +: 8], INIT[1070*9 +: 8], INIT[1069*9 +: 8], INIT[1068*9 +: 8], + INIT[1067*9 +: 8], INIT[1066*9 +: 8], INIT[1065*9 +: 8], INIT[1064*9 +: 8], + INIT[1063*9 +: 8], INIT[1062*9 +: 8], INIT[1061*9 +: 8], INIT[1060*9 +: 8], + INIT[1059*9 +: 8], INIT[1058*9 +: 8], INIT[1057*9 +: 8], INIT[1056*9 +: 8]}), +.INIT_22({INIT[1119*9 +: 8], INIT[1118*9 +: 8], INIT[1117*9 +: 8], INIT[1116*9 +: 8], + INIT[1115*9 +: 8], INIT[1114*9 +: 8], INIT[1113*9 +: 8], INIT[1112*9 +: 8], + INIT[1111*9 +: 8], INIT[1110*9 +: 8], INIT[1109*9 +: 8], INIT[1108*9 +: 8], + INIT[1107*9 +: 8], INIT[1106*9 +: 8], INIT[1105*9 +: 8], INIT[1104*9 +: 8], + INIT[1103*9 +: 8], INIT[1102*9 +: 8], INIT[1101*9 +: 8], INIT[1100*9 +: 8], + INIT[1099*9 +: 8], INIT[1098*9 +: 8], INIT[1097*9 +: 8], INIT[1096*9 +: 8], + INIT[1095*9 +: 8], INIT[1094*9 +: 8], INIT[1093*9 +: 8], INIT[1092*9 +: 8], + INIT[1091*9 +: 8], INIT[1090*9 +: 8], INIT[1089*9 +: 8], INIT[1088*9 +: 8]}), +.INIT_23({INIT[1151*9 +: 8], INIT[1150*9 +: 8], INIT[1149*9 +: 8], INIT[1148*9 +: 8], + INIT[1147*9 +: 8], INIT[1146*9 +: 8], INIT[1145*9 +: 8], INIT[1144*9 +: 8], + INIT[1143*9 +: 8], INIT[1142*9 +: 8], INIT[1141*9 +: 8], INIT[1140*9 +: 8], + INIT[1139*9 +: 8], INIT[1138*9 +: 8], INIT[1137*9 +: 8], INIT[1136*9 +: 8], + INIT[1135*9 +: 8], INIT[1134*9 +: 8], INIT[1133*9 +: 8], INIT[1132*9 +: 8], + INIT[1131*9 +: 8], INIT[1130*9 +: 8], INIT[1129*9 +: 8], INIT[1128*9 +: 8], + INIT[1127*9 +: 8], INIT[1126*9 +: 8], INIT[1125*9 +: 8], INIT[1124*9 +: 8], + INIT[1123*9 +: 8], INIT[1122*9 +: 8], INIT[1121*9 +: 8], INIT[1120*9 +: 8]}), +.INIT_24({INIT[1183*9 +: 8], INIT[1182*9 +: 8], INIT[1181*9 +: 8], INIT[1180*9 +: 8], + INIT[1179*9 +: 8], INIT[1178*9 +: 8], INIT[1177*9 +: 8], INIT[1176*9 +: 8], + INIT[1175*9 +: 8], INIT[1174*9 +: 8], INIT[1173*9 +: 8], INIT[1172*9 +: 8], + INIT[1171*9 +: 8], INIT[1170*9 +: 8], INIT[1169*9 +: 8], INIT[1168*9 +: 8], + INIT[1167*9 +: 8], INIT[1166*9 +: 8], INIT[1165*9 +: 8], INIT[1164*9 +: 8], + INIT[1163*9 +: 8], INIT[1162*9 +: 8], INIT[1161*9 +: 8], INIT[1160*9 +: 8], + INIT[1159*9 +: 8], INIT[1158*9 +: 8], INIT[1157*9 +: 8], INIT[1156*9 +: 8], + INIT[1155*9 +: 8], INIT[1154*9 +: 8], INIT[1153*9 +: 8], INIT[1152*9 +: 8]}), +.INIT_25({INIT[1215*9 +: 8], INIT[1214*9 +: 8], INIT[1213*9 +: 8], INIT[1212*9 +: 8], + INIT[1211*9 +: 8], INIT[1210*9 +: 8], INIT[1209*9 +: 8], INIT[1208*9 +: 8], + INIT[1207*9 +: 8], INIT[1206*9 +: 8], INIT[1205*9 +: 8], INIT[1204*9 +: 8], + INIT[1203*9 +: 8], INIT[1202*9 +: 8], INIT[1201*9 +: 8], INIT[1200*9 +: 8], + INIT[1199*9 +: 8], INIT[1198*9 +: 8], INIT[1197*9 +: 8], INIT[1196*9 +: 8], + INIT[1195*9 +: 8], INIT[1194*9 +: 8], INIT[1193*9 +: 8], INIT[1192*9 +: 8], + INIT[1191*9 +: 8], INIT[1190*9 +: 8], INIT[1189*9 +: 8], INIT[1188*9 +: 8], + INIT[1187*9 +: 8], INIT[1186*9 +: 8], INIT[1185*9 +: 8], INIT[1184*9 +: 8]}), +.INIT_26({INIT[1247*9 +: 8], INIT[1246*9 +: 8], INIT[1245*9 +: 8], INIT[1244*9 +: 8], + INIT[1243*9 +: 8], INIT[1242*9 +: 8], INIT[1241*9 +: 8], INIT[1240*9 +: 8], + INIT[1239*9 +: 8], INIT[1238*9 +: 8], INIT[1237*9 +: 8], INIT[1236*9 +: 8], + INIT[1235*9 +: 8], INIT[1234*9 +: 8], INIT[1233*9 +: 8], INIT[1232*9 +: 8], + INIT[1231*9 +: 8], INIT[1230*9 +: 8], INIT[1229*9 +: 8], INIT[1228*9 +: 8], + INIT[1227*9 +: 8], INIT[1226*9 +: 8], INIT[1225*9 +: 8], INIT[1224*9 +: 8], + INIT[1223*9 +: 8], INIT[1222*9 +: 8], INIT[1221*9 +: 8], INIT[1220*9 +: 8], + INIT[1219*9 +: 8], INIT[1218*9 +: 8], INIT[1217*9 +: 8], INIT[1216*9 +: 8]}), +.INIT_27({INIT[1279*9 +: 8], INIT[1278*9 +: 8], INIT[1277*9 +: 8], INIT[1276*9 +: 8], + INIT[1275*9 +: 8], INIT[1274*9 +: 8], INIT[1273*9 +: 8], INIT[1272*9 +: 8], + INIT[1271*9 +: 8], INIT[1270*9 +: 8], INIT[1269*9 +: 8], INIT[1268*9 +: 8], + INIT[1267*9 +: 8], INIT[1266*9 +: 8], INIT[1265*9 +: 8], INIT[1264*9 +: 8], + INIT[1263*9 +: 8], INIT[1262*9 +: 8], INIT[1261*9 +: 8], INIT[1260*9 +: 8], + INIT[1259*9 +: 8], INIT[1258*9 +: 8], INIT[1257*9 +: 8], INIT[1256*9 +: 8], + INIT[1255*9 +: 8], INIT[1254*9 +: 8], INIT[1253*9 +: 8], INIT[1252*9 +: 8], + INIT[1251*9 +: 8], INIT[1250*9 +: 8], INIT[1249*9 +: 8], INIT[1248*9 +: 8]}), +.INIT_28({INIT[1311*9 +: 8], INIT[1310*9 +: 8], INIT[1309*9 +: 8], INIT[1308*9 +: 8], + INIT[1307*9 +: 8], INIT[1306*9 +: 8], INIT[1305*9 +: 8], INIT[1304*9 +: 8], + INIT[1303*9 +: 8], INIT[1302*9 +: 8], INIT[1301*9 +: 8], INIT[1300*9 +: 8], + INIT[1299*9 +: 8], INIT[1298*9 +: 8], INIT[1297*9 +: 8], INIT[1296*9 +: 8], + INIT[1295*9 +: 8], INIT[1294*9 +: 8], INIT[1293*9 +: 8], INIT[1292*9 +: 8], + INIT[1291*9 +: 8], INIT[1290*9 +: 8], INIT[1289*9 +: 8], INIT[1288*9 +: 8], + INIT[1287*9 +: 8], INIT[1286*9 +: 8], INIT[1285*9 +: 8], INIT[1284*9 +: 8], + INIT[1283*9 +: 8], INIT[1282*9 +: 8], INIT[1281*9 +: 8], INIT[1280*9 +: 8]}), +.INIT_29({INIT[1343*9 +: 8], INIT[1342*9 +: 8], INIT[1341*9 +: 8], INIT[1340*9 +: 8], + INIT[1339*9 +: 8], INIT[1338*9 +: 8], INIT[1337*9 +: 8], INIT[1336*9 +: 8], + INIT[1335*9 +: 8], INIT[1334*9 +: 8], INIT[1333*9 +: 8], INIT[1332*9 +: 8], + INIT[1331*9 +: 8], INIT[1330*9 +: 8], INIT[1329*9 +: 8], INIT[1328*9 +: 8], + INIT[1327*9 +: 8], INIT[1326*9 +: 8], INIT[1325*9 +: 8], INIT[1324*9 +: 8], + INIT[1323*9 +: 8], INIT[1322*9 +: 8], INIT[1321*9 +: 8], INIT[1320*9 +: 8], + INIT[1319*9 +: 8], INIT[1318*9 +: 8], INIT[1317*9 +: 8], INIT[1316*9 +: 8], + INIT[1315*9 +: 8], INIT[1314*9 +: 8], INIT[1313*9 +: 8], INIT[1312*9 +: 8]}), +.INIT_2A({INIT[1375*9 +: 8], INIT[1374*9 +: 8], INIT[1373*9 +: 8], INIT[1372*9 +: 8], + INIT[1371*9 +: 8], INIT[1370*9 +: 8], INIT[1369*9 +: 8], INIT[1368*9 +: 8], + INIT[1367*9 +: 8], INIT[1366*9 +: 8], INIT[1365*9 +: 8], INIT[1364*9 +: 8], + INIT[1363*9 +: 8], INIT[1362*9 +: 8], INIT[1361*9 +: 8], INIT[1360*9 +: 8], + INIT[1359*9 +: 8], INIT[1358*9 +: 8], INIT[1357*9 +: 8], INIT[1356*9 +: 8], + INIT[1355*9 +: 8], INIT[1354*9 +: 8], INIT[1353*9 +: 8], INIT[1352*9 +: 8], + INIT[1351*9 +: 8], INIT[1350*9 +: 8], INIT[1349*9 +: 8], INIT[1348*9 +: 8], + INIT[1347*9 +: 8], INIT[1346*9 +: 8], INIT[1345*9 +: 8], INIT[1344*9 +: 8]}), +.INIT_2B({INIT[1407*9 +: 8], INIT[1406*9 +: 8], INIT[1405*9 +: 8], INIT[1404*9 +: 8], + INIT[1403*9 +: 8], INIT[1402*9 +: 8], INIT[1401*9 +: 8], INIT[1400*9 +: 8], + INIT[1399*9 +: 8], INIT[1398*9 +: 8], INIT[1397*9 +: 8], INIT[1396*9 +: 8], + INIT[1395*9 +: 8], INIT[1394*9 +: 8], INIT[1393*9 +: 8], INIT[1392*9 +: 8], + INIT[1391*9 +: 8], INIT[1390*9 +: 8], INIT[1389*9 +: 8], INIT[1388*9 +: 8], + INIT[1387*9 +: 8], INIT[1386*9 +: 8], INIT[1385*9 +: 8], INIT[1384*9 +: 8], + INIT[1383*9 +: 8], INIT[1382*9 +: 8], INIT[1381*9 +: 8], INIT[1380*9 +: 8], + INIT[1379*9 +: 8], INIT[1378*9 +: 8], INIT[1377*9 +: 8], INIT[1376*9 +: 8]}), +.INIT_2C({INIT[1439*9 +: 8], INIT[1438*9 +: 8], INIT[1437*9 +: 8], INIT[1436*9 +: 8], + INIT[1435*9 +: 8], INIT[1434*9 +: 8], INIT[1433*9 +: 8], INIT[1432*9 +: 8], + INIT[1431*9 +: 8], INIT[1430*9 +: 8], INIT[1429*9 +: 8], INIT[1428*9 +: 8], + INIT[1427*9 +: 8], INIT[1426*9 +: 8], INIT[1425*9 +: 8], INIT[1424*9 +: 8], + INIT[1423*9 +: 8], INIT[1422*9 +: 8], INIT[1421*9 +: 8], INIT[1420*9 +: 8], + INIT[1419*9 +: 8], INIT[1418*9 +: 8], INIT[1417*9 +: 8], INIT[1416*9 +: 8], + INIT[1415*9 +: 8], INIT[1414*9 +: 8], INIT[1413*9 +: 8], INIT[1412*9 +: 8], + INIT[1411*9 +: 8], INIT[1410*9 +: 8], INIT[1409*9 +: 8], INIT[1408*9 +: 8]}), +.INIT_2D({INIT[1471*9 +: 8], INIT[1470*9 +: 8], INIT[1469*9 +: 8], INIT[1468*9 +: 8], + INIT[1467*9 +: 8], INIT[1466*9 +: 8], INIT[1465*9 +: 8], INIT[1464*9 +: 8], + INIT[1463*9 +: 8], INIT[1462*9 +: 8], INIT[1461*9 +: 8], INIT[1460*9 +: 8], + INIT[1459*9 +: 8], INIT[1458*9 +: 8], INIT[1457*9 +: 8], INIT[1456*9 +: 8], + INIT[1455*9 +: 8], INIT[1454*9 +: 8], INIT[1453*9 +: 8], INIT[1452*9 +: 8], + INIT[1451*9 +: 8], INIT[1450*9 +: 8], INIT[1449*9 +: 8], INIT[1448*9 +: 8], + INIT[1447*9 +: 8], INIT[1446*9 +: 8], INIT[1445*9 +: 8], INIT[1444*9 +: 8], + INIT[1443*9 +: 8], INIT[1442*9 +: 8], INIT[1441*9 +: 8], INIT[1440*9 +: 8]}), +.INIT_2E({INIT[1503*9 +: 8], INIT[1502*9 +: 8], INIT[1501*9 +: 8], INIT[1500*9 +: 8], + INIT[1499*9 +: 8], INIT[1498*9 +: 8], INIT[1497*9 +: 8], INIT[1496*9 +: 8], + INIT[1495*9 +: 8], INIT[1494*9 +: 8], INIT[1493*9 +: 8], INIT[1492*9 +: 8], + INIT[1491*9 +: 8], INIT[1490*9 +: 8], INIT[1489*9 +: 8], INIT[1488*9 +: 8], + INIT[1487*9 +: 8], INIT[1486*9 +: 8], INIT[1485*9 +: 8], INIT[1484*9 +: 8], + INIT[1483*9 +: 8], INIT[1482*9 +: 8], INIT[1481*9 +: 8], INIT[1480*9 +: 8], + INIT[1479*9 +: 8], INIT[1478*9 +: 8], INIT[1477*9 +: 8], INIT[1476*9 +: 8], + INIT[1475*9 +: 8], INIT[1474*9 +: 8], INIT[1473*9 +: 8], INIT[1472*9 +: 8]}), +.INIT_2F({INIT[1535*9 +: 8], INIT[1534*9 +: 8], INIT[1533*9 +: 8], INIT[1532*9 +: 8], + INIT[1531*9 +: 8], INIT[1530*9 +: 8], INIT[1529*9 +: 8], INIT[1528*9 +: 8], + INIT[1527*9 +: 8], INIT[1526*9 +: 8], INIT[1525*9 +: 8], INIT[1524*9 +: 8], + INIT[1523*9 +: 8], INIT[1522*9 +: 8], INIT[1521*9 +: 8], INIT[1520*9 +: 8], + INIT[1519*9 +: 8], INIT[1518*9 +: 8], INIT[1517*9 +: 8], INIT[1516*9 +: 8], + INIT[1515*9 +: 8], INIT[1514*9 +: 8], INIT[1513*9 +: 8], INIT[1512*9 +: 8], + INIT[1511*9 +: 8], INIT[1510*9 +: 8], INIT[1509*9 +: 8], INIT[1508*9 +: 8], + INIT[1507*9 +: 8], INIT[1506*9 +: 8], INIT[1505*9 +: 8], INIT[1504*9 +: 8]}), +.INIT_30({INIT[1567*9 +: 8], INIT[1566*9 +: 8], INIT[1565*9 +: 8], INIT[1564*9 +: 8], + INIT[1563*9 +: 8], INIT[1562*9 +: 8], INIT[1561*9 +: 8], INIT[1560*9 +: 8], + INIT[1559*9 +: 8], INIT[1558*9 +: 8], INIT[1557*9 +: 8], INIT[1556*9 +: 8], + INIT[1555*9 +: 8], INIT[1554*9 +: 8], INIT[1553*9 +: 8], INIT[1552*9 +: 8], + INIT[1551*9 +: 8], INIT[1550*9 +: 8], INIT[1549*9 +: 8], INIT[1548*9 +: 8], + INIT[1547*9 +: 8], INIT[1546*9 +: 8], INIT[1545*9 +: 8], INIT[1544*9 +: 8], + INIT[1543*9 +: 8], INIT[1542*9 +: 8], INIT[1541*9 +: 8], INIT[1540*9 +: 8], + INIT[1539*9 +: 8], INIT[1538*9 +: 8], INIT[1537*9 +: 8], INIT[1536*9 +: 8]}), +.INIT_31({INIT[1599*9 +: 8], INIT[1598*9 +: 8], INIT[1597*9 +: 8], INIT[1596*9 +: 8], + INIT[1595*9 +: 8], INIT[1594*9 +: 8], INIT[1593*9 +: 8], INIT[1592*9 +: 8], + INIT[1591*9 +: 8], INIT[1590*9 +: 8], INIT[1589*9 +: 8], INIT[1588*9 +: 8], + INIT[1587*9 +: 8], INIT[1586*9 +: 8], INIT[1585*9 +: 8], INIT[1584*9 +: 8], + INIT[1583*9 +: 8], INIT[1582*9 +: 8], INIT[1581*9 +: 8], INIT[1580*9 +: 8], + INIT[1579*9 +: 8], INIT[1578*9 +: 8], INIT[1577*9 +: 8], INIT[1576*9 +: 8], + INIT[1575*9 +: 8], INIT[1574*9 +: 8], INIT[1573*9 +: 8], INIT[1572*9 +: 8], + INIT[1571*9 +: 8], INIT[1570*9 +: 8], INIT[1569*9 +: 8], INIT[1568*9 +: 8]}), +.INIT_32({INIT[1631*9 +: 8], INIT[1630*9 +: 8], INIT[1629*9 +: 8], INIT[1628*9 +: 8], + INIT[1627*9 +: 8], INIT[1626*9 +: 8], INIT[1625*9 +: 8], INIT[1624*9 +: 8], + INIT[1623*9 +: 8], INIT[1622*9 +: 8], INIT[1621*9 +: 8], INIT[1620*9 +: 8], + INIT[1619*9 +: 8], INIT[1618*9 +: 8], INIT[1617*9 +: 8], INIT[1616*9 +: 8], + INIT[1615*9 +: 8], INIT[1614*9 +: 8], INIT[1613*9 +: 8], INIT[1612*9 +: 8], + INIT[1611*9 +: 8], INIT[1610*9 +: 8], INIT[1609*9 +: 8], INIT[1608*9 +: 8], + INIT[1607*9 +: 8], INIT[1606*9 +: 8], INIT[1605*9 +: 8], INIT[1604*9 +: 8], + INIT[1603*9 +: 8], INIT[1602*9 +: 8], INIT[1601*9 +: 8], INIT[1600*9 +: 8]}), +.INIT_33({INIT[1663*9 +: 8], INIT[1662*9 +: 8], INIT[1661*9 +: 8], INIT[1660*9 +: 8], + INIT[1659*9 +: 8], INIT[1658*9 +: 8], INIT[1657*9 +: 8], INIT[1656*9 +: 8], + INIT[1655*9 +: 8], INIT[1654*9 +: 8], INIT[1653*9 +: 8], INIT[1652*9 +: 8], + INIT[1651*9 +: 8], INIT[1650*9 +: 8], INIT[1649*9 +: 8], INIT[1648*9 +: 8], + INIT[1647*9 +: 8], INIT[1646*9 +: 8], INIT[1645*9 +: 8], INIT[1644*9 +: 8], + INIT[1643*9 +: 8], INIT[1642*9 +: 8], INIT[1641*9 +: 8], INIT[1640*9 +: 8], + INIT[1639*9 +: 8], INIT[1638*9 +: 8], INIT[1637*9 +: 8], INIT[1636*9 +: 8], + INIT[1635*9 +: 8], INIT[1634*9 +: 8], INIT[1633*9 +: 8], INIT[1632*9 +: 8]}), +.INIT_34({INIT[1695*9 +: 8], INIT[1694*9 +: 8], INIT[1693*9 +: 8], INIT[1692*9 +: 8], + INIT[1691*9 +: 8], INIT[1690*9 +: 8], INIT[1689*9 +: 8], INIT[1688*9 +: 8], + INIT[1687*9 +: 8], INIT[1686*9 +: 8], INIT[1685*9 +: 8], INIT[1684*9 +: 8], + INIT[1683*9 +: 8], INIT[1682*9 +: 8], INIT[1681*9 +: 8], INIT[1680*9 +: 8], + INIT[1679*9 +: 8], INIT[1678*9 +: 8], INIT[1677*9 +: 8], INIT[1676*9 +: 8], + INIT[1675*9 +: 8], INIT[1674*9 +: 8], INIT[1673*9 +: 8], INIT[1672*9 +: 8], + INIT[1671*9 +: 8], INIT[1670*9 +: 8], INIT[1669*9 +: 8], INIT[1668*9 +: 8], + INIT[1667*9 +: 8], INIT[1666*9 +: 8], INIT[1665*9 +: 8], INIT[1664*9 +: 8]}), +.INIT_35({INIT[1727*9 +: 8], INIT[1726*9 +: 8], INIT[1725*9 +: 8], INIT[1724*9 +: 8], + INIT[1723*9 +: 8], INIT[1722*9 +: 8], INIT[1721*9 +: 8], INIT[1720*9 +: 8], + INIT[1719*9 +: 8], INIT[1718*9 +: 8], INIT[1717*9 +: 8], INIT[1716*9 +: 8], + INIT[1715*9 +: 8], INIT[1714*9 +: 8], INIT[1713*9 +: 8], INIT[1712*9 +: 8], + INIT[1711*9 +: 8], INIT[1710*9 +: 8], INIT[1709*9 +: 8], INIT[1708*9 +: 8], + INIT[1707*9 +: 8], INIT[1706*9 +: 8], INIT[1705*9 +: 8], INIT[1704*9 +: 8], + INIT[1703*9 +: 8], INIT[1702*9 +: 8], INIT[1701*9 +: 8], INIT[1700*9 +: 8], + INIT[1699*9 +: 8], INIT[1698*9 +: 8], INIT[1697*9 +: 8], INIT[1696*9 +: 8]}), +.INIT_36({INIT[1759*9 +: 8], INIT[1758*9 +: 8], INIT[1757*9 +: 8], INIT[1756*9 +: 8], + INIT[1755*9 +: 8], INIT[1754*9 +: 8], INIT[1753*9 +: 8], INIT[1752*9 +: 8], + INIT[1751*9 +: 8], INIT[1750*9 +: 8], INIT[1749*9 +: 8], INIT[1748*9 +: 8], + INIT[1747*9 +: 8], INIT[1746*9 +: 8], INIT[1745*9 +: 8], INIT[1744*9 +: 8], + INIT[1743*9 +: 8], INIT[1742*9 +: 8], INIT[1741*9 +: 8], INIT[1740*9 +: 8], + INIT[1739*9 +: 8], INIT[1738*9 +: 8], INIT[1737*9 +: 8], INIT[1736*9 +: 8], + INIT[1735*9 +: 8], INIT[1734*9 +: 8], INIT[1733*9 +: 8], INIT[1732*9 +: 8], + INIT[1731*9 +: 8], INIT[1730*9 +: 8], INIT[1729*9 +: 8], INIT[1728*9 +: 8]}), +.INIT_37({INIT[1791*9 +: 8], INIT[1790*9 +: 8], INIT[1789*9 +: 8], INIT[1788*9 +: 8], + INIT[1787*9 +: 8], INIT[1786*9 +: 8], INIT[1785*9 +: 8], INIT[1784*9 +: 8], + INIT[1783*9 +: 8], INIT[1782*9 +: 8], INIT[1781*9 +: 8], INIT[1780*9 +: 8], + INIT[1779*9 +: 8], INIT[1778*9 +: 8], INIT[1777*9 +: 8], INIT[1776*9 +: 8], + INIT[1775*9 +: 8], INIT[1774*9 +: 8], INIT[1773*9 +: 8], INIT[1772*9 +: 8], + INIT[1771*9 +: 8], INIT[1770*9 +: 8], INIT[1769*9 +: 8], INIT[1768*9 +: 8], + INIT[1767*9 +: 8], INIT[1766*9 +: 8], INIT[1765*9 +: 8], INIT[1764*9 +: 8], + INIT[1763*9 +: 8], INIT[1762*9 +: 8], INIT[1761*9 +: 8], INIT[1760*9 +: 8]}), +.INIT_38({INIT[1823*9 +: 8], INIT[1822*9 +: 8], INIT[1821*9 +: 8], INIT[1820*9 +: 8], + INIT[1819*9 +: 8], INIT[1818*9 +: 8], INIT[1817*9 +: 8], INIT[1816*9 +: 8], + INIT[1815*9 +: 8], INIT[1814*9 +: 8], INIT[1813*9 +: 8], INIT[1812*9 +: 8], + INIT[1811*9 +: 8], INIT[1810*9 +: 8], INIT[1809*9 +: 8], INIT[1808*9 +: 8], + INIT[1807*9 +: 8], INIT[1806*9 +: 8], INIT[1805*9 +: 8], INIT[1804*9 +: 8], + INIT[1803*9 +: 8], INIT[1802*9 +: 8], INIT[1801*9 +: 8], INIT[1800*9 +: 8], + INIT[1799*9 +: 8], INIT[1798*9 +: 8], INIT[1797*9 +: 8], INIT[1796*9 +: 8], + INIT[1795*9 +: 8], INIT[1794*9 +: 8], INIT[1793*9 +: 8], INIT[1792*9 +: 8]}), +.INIT_39({INIT[1855*9 +: 8], INIT[1854*9 +: 8], INIT[1853*9 +: 8], INIT[1852*9 +: 8], + INIT[1851*9 +: 8], INIT[1850*9 +: 8], INIT[1849*9 +: 8], INIT[1848*9 +: 8], + INIT[1847*9 +: 8], INIT[1846*9 +: 8], INIT[1845*9 +: 8], INIT[1844*9 +: 8], + INIT[1843*9 +: 8], INIT[1842*9 +: 8], INIT[1841*9 +: 8], INIT[1840*9 +: 8], + INIT[1839*9 +: 8], INIT[1838*9 +: 8], INIT[1837*9 +: 8], INIT[1836*9 +: 8], + INIT[1835*9 +: 8], INIT[1834*9 +: 8], INIT[1833*9 +: 8], INIT[1832*9 +: 8], + INIT[1831*9 +: 8], INIT[1830*9 +: 8], INIT[1829*9 +: 8], INIT[1828*9 +: 8], + INIT[1827*9 +: 8], INIT[1826*9 +: 8], INIT[1825*9 +: 8], INIT[1824*9 +: 8]}), +.INIT_3A({INIT[1887*9 +: 8], INIT[1886*9 +: 8], INIT[1885*9 +: 8], INIT[1884*9 +: 8], + INIT[1883*9 +: 8], INIT[1882*9 +: 8], INIT[1881*9 +: 8], INIT[1880*9 +: 8], + INIT[1879*9 +: 8], INIT[1878*9 +: 8], INIT[1877*9 +: 8], INIT[1876*9 +: 8], + INIT[1875*9 +: 8], INIT[1874*9 +: 8], INIT[1873*9 +: 8], INIT[1872*9 +: 8], + INIT[1871*9 +: 8], INIT[1870*9 +: 8], INIT[1869*9 +: 8], INIT[1868*9 +: 8], + INIT[1867*9 +: 8], INIT[1866*9 +: 8], INIT[1865*9 +: 8], INIT[1864*9 +: 8], + INIT[1863*9 +: 8], INIT[1862*9 +: 8], INIT[1861*9 +: 8], INIT[1860*9 +: 8], + INIT[1859*9 +: 8], INIT[1858*9 +: 8], INIT[1857*9 +: 8], INIT[1856*9 +: 8]}), +.INIT_3B({INIT[1919*9 +: 8], INIT[1918*9 +: 8], INIT[1917*9 +: 8], INIT[1916*9 +: 8], + INIT[1915*9 +: 8], INIT[1914*9 +: 8], INIT[1913*9 +: 8], INIT[1912*9 +: 8], + INIT[1911*9 +: 8], INIT[1910*9 +: 8], INIT[1909*9 +: 8], INIT[1908*9 +: 8], + INIT[1907*9 +: 8], INIT[1906*9 +: 8], INIT[1905*9 +: 8], INIT[1904*9 +: 8], + INIT[1903*9 +: 8], INIT[1902*9 +: 8], INIT[1901*9 +: 8], INIT[1900*9 +: 8], + INIT[1899*9 +: 8], INIT[1898*9 +: 8], INIT[1897*9 +: 8], INIT[1896*9 +: 8], + INIT[1895*9 +: 8], INIT[1894*9 +: 8], INIT[1893*9 +: 8], INIT[1892*9 +: 8], + INIT[1891*9 +: 8], INIT[1890*9 +: 8], INIT[1889*9 +: 8], INIT[1888*9 +: 8]}), +.INIT_3C({INIT[1951*9 +: 8], INIT[1950*9 +: 8], INIT[1949*9 +: 8], INIT[1948*9 +: 8], + INIT[1947*9 +: 8], INIT[1946*9 +: 8], INIT[1945*9 +: 8], INIT[1944*9 +: 8], + INIT[1943*9 +: 8], INIT[1942*9 +: 8], INIT[1941*9 +: 8], INIT[1940*9 +: 8], + INIT[1939*9 +: 8], INIT[1938*9 +: 8], INIT[1937*9 +: 8], INIT[1936*9 +: 8], + INIT[1935*9 +: 8], INIT[1934*9 +: 8], INIT[1933*9 +: 8], INIT[1932*9 +: 8], + INIT[1931*9 +: 8], INIT[1930*9 +: 8], INIT[1929*9 +: 8], INIT[1928*9 +: 8], + INIT[1927*9 +: 8], INIT[1926*9 +: 8], INIT[1925*9 +: 8], INIT[1924*9 +: 8], + INIT[1923*9 +: 8], INIT[1922*9 +: 8], INIT[1921*9 +: 8], INIT[1920*9 +: 8]}), +.INIT_3D({INIT[1983*9 +: 8], INIT[1982*9 +: 8], INIT[1981*9 +: 8], INIT[1980*9 +: 8], + INIT[1979*9 +: 8], INIT[1978*9 +: 8], INIT[1977*9 +: 8], INIT[1976*9 +: 8], + INIT[1975*9 +: 8], INIT[1974*9 +: 8], INIT[1973*9 +: 8], INIT[1972*9 +: 8], + INIT[1971*9 +: 8], INIT[1970*9 +: 8], INIT[1969*9 +: 8], INIT[1968*9 +: 8], + INIT[1967*9 +: 8], INIT[1966*9 +: 8], INIT[1965*9 +: 8], INIT[1964*9 +: 8], + INIT[1963*9 +: 8], INIT[1962*9 +: 8], INIT[1961*9 +: 8], INIT[1960*9 +: 8], + INIT[1959*9 +: 8], INIT[1958*9 +: 8], INIT[1957*9 +: 8], INIT[1956*9 +: 8], + INIT[1955*9 +: 8], INIT[1954*9 +: 8], INIT[1953*9 +: 8], INIT[1952*9 +: 8]}), +.INIT_3E({INIT[2015*9 +: 8], INIT[2014*9 +: 8], INIT[2013*9 +: 8], INIT[2012*9 +: 8], + INIT[2011*9 +: 8], INIT[2010*9 +: 8], INIT[2009*9 +: 8], INIT[2008*9 +: 8], + INIT[2007*9 +: 8], INIT[2006*9 +: 8], INIT[2005*9 +: 8], INIT[2004*9 +: 8], + INIT[2003*9 +: 8], INIT[2002*9 +: 8], INIT[2001*9 +: 8], INIT[2000*9 +: 8], + INIT[1999*9 +: 8], INIT[1998*9 +: 8], INIT[1997*9 +: 8], INIT[1996*9 +: 8], + INIT[1995*9 +: 8], INIT[1994*9 +: 8], INIT[1993*9 +: 8], INIT[1992*9 +: 8], + INIT[1991*9 +: 8], INIT[1990*9 +: 8], INIT[1989*9 +: 8], INIT[1988*9 +: 8], + INIT[1987*9 +: 8], INIT[1986*9 +: 8], INIT[1985*9 +: 8], INIT[1984*9 +: 8]}), +.INIT_3F({INIT[2047*9 +: 8], INIT[2046*9 +: 8], INIT[2045*9 +: 8], INIT[2044*9 +: 8], + INIT[2043*9 +: 8], INIT[2042*9 +: 8], INIT[2041*9 +: 8], INIT[2040*9 +: 8], + INIT[2039*9 +: 8], INIT[2038*9 +: 8], INIT[2037*9 +: 8], INIT[2036*9 +: 8], + INIT[2035*9 +: 8], INIT[2034*9 +: 8], INIT[2033*9 +: 8], INIT[2032*9 +: 8], + INIT[2031*9 +: 8], INIT[2030*9 +: 8], INIT[2029*9 +: 8], INIT[2028*9 +: 8], + INIT[2027*9 +: 8], INIT[2026*9 +: 8], INIT[2025*9 +: 8], INIT[2024*9 +: 8], + INIT[2023*9 +: 8], INIT[2022*9 +: 8], INIT[2021*9 +: 8], INIT[2020*9 +: 8], + INIT[2019*9 +: 8], INIT[2018*9 +: 8], INIT[2017*9 +: 8], INIT[2016*9 +: 8]}), +.INIT_40({INIT[2079*9 +: 8], INIT[2078*9 +: 8], INIT[2077*9 +: 8], INIT[2076*9 +: 8], + INIT[2075*9 +: 8], INIT[2074*9 +: 8], INIT[2073*9 +: 8], INIT[2072*9 +: 8], + INIT[2071*9 +: 8], INIT[2070*9 +: 8], INIT[2069*9 +: 8], INIT[2068*9 +: 8], + INIT[2067*9 +: 8], INIT[2066*9 +: 8], INIT[2065*9 +: 8], INIT[2064*9 +: 8], + INIT[2063*9 +: 8], INIT[2062*9 +: 8], INIT[2061*9 +: 8], INIT[2060*9 +: 8], + INIT[2059*9 +: 8], INIT[2058*9 +: 8], INIT[2057*9 +: 8], INIT[2056*9 +: 8], + INIT[2055*9 +: 8], INIT[2054*9 +: 8], INIT[2053*9 +: 8], INIT[2052*9 +: 8], + INIT[2051*9 +: 8], INIT[2050*9 +: 8], INIT[2049*9 +: 8], INIT[2048*9 +: 8]}), +.INIT_41({INIT[2111*9 +: 8], INIT[2110*9 +: 8], INIT[2109*9 +: 8], INIT[2108*9 +: 8], + INIT[2107*9 +: 8], INIT[2106*9 +: 8], INIT[2105*9 +: 8], INIT[2104*9 +: 8], + INIT[2103*9 +: 8], INIT[2102*9 +: 8], INIT[2101*9 +: 8], INIT[2100*9 +: 8], + INIT[2099*9 +: 8], INIT[2098*9 +: 8], INIT[2097*9 +: 8], INIT[2096*9 +: 8], + INIT[2095*9 +: 8], INIT[2094*9 +: 8], INIT[2093*9 +: 8], INIT[2092*9 +: 8], + INIT[2091*9 +: 8], INIT[2090*9 +: 8], INIT[2089*9 +: 8], INIT[2088*9 +: 8], + INIT[2087*9 +: 8], INIT[2086*9 +: 8], INIT[2085*9 +: 8], INIT[2084*9 +: 8], + INIT[2083*9 +: 8], INIT[2082*9 +: 8], INIT[2081*9 +: 8], INIT[2080*9 +: 8]}), +.INIT_42({INIT[2143*9 +: 8], INIT[2142*9 +: 8], INIT[2141*9 +: 8], INIT[2140*9 +: 8], + INIT[2139*9 +: 8], INIT[2138*9 +: 8], INIT[2137*9 +: 8], INIT[2136*9 +: 8], + INIT[2135*9 +: 8], INIT[2134*9 +: 8], INIT[2133*9 +: 8], INIT[2132*9 +: 8], + INIT[2131*9 +: 8], INIT[2130*9 +: 8], INIT[2129*9 +: 8], INIT[2128*9 +: 8], + INIT[2127*9 +: 8], INIT[2126*9 +: 8], INIT[2125*9 +: 8], INIT[2124*9 +: 8], + INIT[2123*9 +: 8], INIT[2122*9 +: 8], INIT[2121*9 +: 8], INIT[2120*9 +: 8], + INIT[2119*9 +: 8], INIT[2118*9 +: 8], INIT[2117*9 +: 8], INIT[2116*9 +: 8], + INIT[2115*9 +: 8], INIT[2114*9 +: 8], INIT[2113*9 +: 8], INIT[2112*9 +: 8]}), +.INIT_43({INIT[2175*9 +: 8], INIT[2174*9 +: 8], INIT[2173*9 +: 8], INIT[2172*9 +: 8], + INIT[2171*9 +: 8], INIT[2170*9 +: 8], INIT[2169*9 +: 8], INIT[2168*9 +: 8], + INIT[2167*9 +: 8], INIT[2166*9 +: 8], INIT[2165*9 +: 8], INIT[2164*9 +: 8], + INIT[2163*9 +: 8], INIT[2162*9 +: 8], INIT[2161*9 +: 8], INIT[2160*9 +: 8], + INIT[2159*9 +: 8], INIT[2158*9 +: 8], INIT[2157*9 +: 8], INIT[2156*9 +: 8], + INIT[2155*9 +: 8], INIT[2154*9 +: 8], INIT[2153*9 +: 8], INIT[2152*9 +: 8], + INIT[2151*9 +: 8], INIT[2150*9 +: 8], INIT[2149*9 +: 8], INIT[2148*9 +: 8], + INIT[2147*9 +: 8], INIT[2146*9 +: 8], INIT[2145*9 +: 8], INIT[2144*9 +: 8]}), +.INIT_44({INIT[2207*9 +: 8], INIT[2206*9 +: 8], INIT[2205*9 +: 8], INIT[2204*9 +: 8], + INIT[2203*9 +: 8], INIT[2202*9 +: 8], INIT[2201*9 +: 8], INIT[2200*9 +: 8], + INIT[2199*9 +: 8], INIT[2198*9 +: 8], INIT[2197*9 +: 8], INIT[2196*9 +: 8], + INIT[2195*9 +: 8], INIT[2194*9 +: 8], INIT[2193*9 +: 8], INIT[2192*9 +: 8], + INIT[2191*9 +: 8], INIT[2190*9 +: 8], INIT[2189*9 +: 8], INIT[2188*9 +: 8], + INIT[2187*9 +: 8], INIT[2186*9 +: 8], INIT[2185*9 +: 8], INIT[2184*9 +: 8], + INIT[2183*9 +: 8], INIT[2182*9 +: 8], INIT[2181*9 +: 8], INIT[2180*9 +: 8], + INIT[2179*9 +: 8], INIT[2178*9 +: 8], INIT[2177*9 +: 8], INIT[2176*9 +: 8]}), +.INIT_45({INIT[2239*9 +: 8], INIT[2238*9 +: 8], INIT[2237*9 +: 8], INIT[2236*9 +: 8], + INIT[2235*9 +: 8], INIT[2234*9 +: 8], INIT[2233*9 +: 8], INIT[2232*9 +: 8], + INIT[2231*9 +: 8], INIT[2230*9 +: 8], INIT[2229*9 +: 8], INIT[2228*9 +: 8], + INIT[2227*9 +: 8], INIT[2226*9 +: 8], INIT[2225*9 +: 8], INIT[2224*9 +: 8], + INIT[2223*9 +: 8], INIT[2222*9 +: 8], INIT[2221*9 +: 8], INIT[2220*9 +: 8], + INIT[2219*9 +: 8], INIT[2218*9 +: 8], INIT[2217*9 +: 8], INIT[2216*9 +: 8], + INIT[2215*9 +: 8], INIT[2214*9 +: 8], INIT[2213*9 +: 8], INIT[2212*9 +: 8], + INIT[2211*9 +: 8], INIT[2210*9 +: 8], INIT[2209*9 +: 8], INIT[2208*9 +: 8]}), +.INIT_46({INIT[2271*9 +: 8], INIT[2270*9 +: 8], INIT[2269*9 +: 8], INIT[2268*9 +: 8], + INIT[2267*9 +: 8], INIT[2266*9 +: 8], INIT[2265*9 +: 8], INIT[2264*9 +: 8], + INIT[2263*9 +: 8], INIT[2262*9 +: 8], INIT[2261*9 +: 8], INIT[2260*9 +: 8], + INIT[2259*9 +: 8], INIT[2258*9 +: 8], INIT[2257*9 +: 8], INIT[2256*9 +: 8], + INIT[2255*9 +: 8], INIT[2254*9 +: 8], INIT[2253*9 +: 8], INIT[2252*9 +: 8], + INIT[2251*9 +: 8], INIT[2250*9 +: 8], INIT[2249*9 +: 8], INIT[2248*9 +: 8], + INIT[2247*9 +: 8], INIT[2246*9 +: 8], INIT[2245*9 +: 8], INIT[2244*9 +: 8], + INIT[2243*9 +: 8], INIT[2242*9 +: 8], INIT[2241*9 +: 8], INIT[2240*9 +: 8]}), +.INIT_47({INIT[2303*9 +: 8], INIT[2302*9 +: 8], INIT[2301*9 +: 8], INIT[2300*9 +: 8], + INIT[2299*9 +: 8], INIT[2298*9 +: 8], INIT[2297*9 +: 8], INIT[2296*9 +: 8], + INIT[2295*9 +: 8], INIT[2294*9 +: 8], INIT[2293*9 +: 8], INIT[2292*9 +: 8], + INIT[2291*9 +: 8], INIT[2290*9 +: 8], INIT[2289*9 +: 8], INIT[2288*9 +: 8], + INIT[2287*9 +: 8], INIT[2286*9 +: 8], INIT[2285*9 +: 8], INIT[2284*9 +: 8], + INIT[2283*9 +: 8], INIT[2282*9 +: 8], INIT[2281*9 +: 8], INIT[2280*9 +: 8], + INIT[2279*9 +: 8], INIT[2278*9 +: 8], INIT[2277*9 +: 8], INIT[2276*9 +: 8], + INIT[2275*9 +: 8], INIT[2274*9 +: 8], INIT[2273*9 +: 8], INIT[2272*9 +: 8]}), +.INIT_48({INIT[2335*9 +: 8], INIT[2334*9 +: 8], INIT[2333*9 +: 8], INIT[2332*9 +: 8], + INIT[2331*9 +: 8], INIT[2330*9 +: 8], INIT[2329*9 +: 8], INIT[2328*9 +: 8], + INIT[2327*9 +: 8], INIT[2326*9 +: 8], INIT[2325*9 +: 8], INIT[2324*9 +: 8], + INIT[2323*9 +: 8], INIT[2322*9 +: 8], INIT[2321*9 +: 8], INIT[2320*9 +: 8], + INIT[2319*9 +: 8], INIT[2318*9 +: 8], INIT[2317*9 +: 8], INIT[2316*9 +: 8], + INIT[2315*9 +: 8], INIT[2314*9 +: 8], INIT[2313*9 +: 8], INIT[2312*9 +: 8], + INIT[2311*9 +: 8], INIT[2310*9 +: 8], INIT[2309*9 +: 8], INIT[2308*9 +: 8], + INIT[2307*9 +: 8], INIT[2306*9 +: 8], INIT[2305*9 +: 8], INIT[2304*9 +: 8]}), +.INIT_49({INIT[2367*9 +: 8], INIT[2366*9 +: 8], INIT[2365*9 +: 8], INIT[2364*9 +: 8], + INIT[2363*9 +: 8], INIT[2362*9 +: 8], INIT[2361*9 +: 8], INIT[2360*9 +: 8], + INIT[2359*9 +: 8], INIT[2358*9 +: 8], INIT[2357*9 +: 8], INIT[2356*9 +: 8], + INIT[2355*9 +: 8], INIT[2354*9 +: 8], INIT[2353*9 +: 8], INIT[2352*9 +: 8], + INIT[2351*9 +: 8], INIT[2350*9 +: 8], INIT[2349*9 +: 8], INIT[2348*9 +: 8], + INIT[2347*9 +: 8], INIT[2346*9 +: 8], INIT[2345*9 +: 8], INIT[2344*9 +: 8], + INIT[2343*9 +: 8], INIT[2342*9 +: 8], INIT[2341*9 +: 8], INIT[2340*9 +: 8], + INIT[2339*9 +: 8], INIT[2338*9 +: 8], INIT[2337*9 +: 8], INIT[2336*9 +: 8]}), +.INIT_4A({INIT[2399*9 +: 8], INIT[2398*9 +: 8], INIT[2397*9 +: 8], INIT[2396*9 +: 8], + INIT[2395*9 +: 8], INIT[2394*9 +: 8], INIT[2393*9 +: 8], INIT[2392*9 +: 8], + INIT[2391*9 +: 8], INIT[2390*9 +: 8], INIT[2389*9 +: 8], INIT[2388*9 +: 8], + INIT[2387*9 +: 8], INIT[2386*9 +: 8], INIT[2385*9 +: 8], INIT[2384*9 +: 8], + INIT[2383*9 +: 8], INIT[2382*9 +: 8], INIT[2381*9 +: 8], INIT[2380*9 +: 8], + INIT[2379*9 +: 8], INIT[2378*9 +: 8], INIT[2377*9 +: 8], INIT[2376*9 +: 8], + INIT[2375*9 +: 8], INIT[2374*9 +: 8], INIT[2373*9 +: 8], INIT[2372*9 +: 8], + INIT[2371*9 +: 8], INIT[2370*9 +: 8], INIT[2369*9 +: 8], INIT[2368*9 +: 8]}), +.INIT_4B({INIT[2431*9 +: 8], INIT[2430*9 +: 8], INIT[2429*9 +: 8], INIT[2428*9 +: 8], + INIT[2427*9 +: 8], INIT[2426*9 +: 8], INIT[2425*9 +: 8], INIT[2424*9 +: 8], + INIT[2423*9 +: 8], INIT[2422*9 +: 8], INIT[2421*9 +: 8], INIT[2420*9 +: 8], + INIT[2419*9 +: 8], INIT[2418*9 +: 8], INIT[2417*9 +: 8], INIT[2416*9 +: 8], + INIT[2415*9 +: 8], INIT[2414*9 +: 8], INIT[2413*9 +: 8], INIT[2412*9 +: 8], + INIT[2411*9 +: 8], INIT[2410*9 +: 8], INIT[2409*9 +: 8], INIT[2408*9 +: 8], + INIT[2407*9 +: 8], INIT[2406*9 +: 8], INIT[2405*9 +: 8], INIT[2404*9 +: 8], + INIT[2403*9 +: 8], INIT[2402*9 +: 8], INIT[2401*9 +: 8], INIT[2400*9 +: 8]}), +.INIT_4C({INIT[2463*9 +: 8], INIT[2462*9 +: 8], INIT[2461*9 +: 8], INIT[2460*9 +: 8], + INIT[2459*9 +: 8], INIT[2458*9 +: 8], INIT[2457*9 +: 8], INIT[2456*9 +: 8], + INIT[2455*9 +: 8], INIT[2454*9 +: 8], INIT[2453*9 +: 8], INIT[2452*9 +: 8], + INIT[2451*9 +: 8], INIT[2450*9 +: 8], INIT[2449*9 +: 8], INIT[2448*9 +: 8], + INIT[2447*9 +: 8], INIT[2446*9 +: 8], INIT[2445*9 +: 8], INIT[2444*9 +: 8], + INIT[2443*9 +: 8], INIT[2442*9 +: 8], INIT[2441*9 +: 8], INIT[2440*9 +: 8], + INIT[2439*9 +: 8], INIT[2438*9 +: 8], INIT[2437*9 +: 8], INIT[2436*9 +: 8], + INIT[2435*9 +: 8], INIT[2434*9 +: 8], INIT[2433*9 +: 8], INIT[2432*9 +: 8]}), +.INIT_4D({INIT[2495*9 +: 8], INIT[2494*9 +: 8], INIT[2493*9 +: 8], INIT[2492*9 +: 8], + INIT[2491*9 +: 8], INIT[2490*9 +: 8], INIT[2489*9 +: 8], INIT[2488*9 +: 8], + INIT[2487*9 +: 8], INIT[2486*9 +: 8], INIT[2485*9 +: 8], INIT[2484*9 +: 8], + INIT[2483*9 +: 8], INIT[2482*9 +: 8], INIT[2481*9 +: 8], INIT[2480*9 +: 8], + INIT[2479*9 +: 8], INIT[2478*9 +: 8], INIT[2477*9 +: 8], INIT[2476*9 +: 8], + INIT[2475*9 +: 8], INIT[2474*9 +: 8], INIT[2473*9 +: 8], INIT[2472*9 +: 8], + INIT[2471*9 +: 8], INIT[2470*9 +: 8], INIT[2469*9 +: 8], INIT[2468*9 +: 8], + INIT[2467*9 +: 8], INIT[2466*9 +: 8], INIT[2465*9 +: 8], INIT[2464*9 +: 8]}), +.INIT_4E({INIT[2527*9 +: 8], INIT[2526*9 +: 8], INIT[2525*9 +: 8], INIT[2524*9 +: 8], + INIT[2523*9 +: 8], INIT[2522*9 +: 8], INIT[2521*9 +: 8], INIT[2520*9 +: 8], + INIT[2519*9 +: 8], INIT[2518*9 +: 8], INIT[2517*9 +: 8], INIT[2516*9 +: 8], + INIT[2515*9 +: 8], INIT[2514*9 +: 8], INIT[2513*9 +: 8], INIT[2512*9 +: 8], + INIT[2511*9 +: 8], INIT[2510*9 +: 8], INIT[2509*9 +: 8], INIT[2508*9 +: 8], + INIT[2507*9 +: 8], INIT[2506*9 +: 8], INIT[2505*9 +: 8], INIT[2504*9 +: 8], + INIT[2503*9 +: 8], INIT[2502*9 +: 8], INIT[2501*9 +: 8], INIT[2500*9 +: 8], + INIT[2499*9 +: 8], INIT[2498*9 +: 8], INIT[2497*9 +: 8], INIT[2496*9 +: 8]}), +.INIT_4F({INIT[2559*9 +: 8], INIT[2558*9 +: 8], INIT[2557*9 +: 8], INIT[2556*9 +: 8], + INIT[2555*9 +: 8], INIT[2554*9 +: 8], INIT[2553*9 +: 8], INIT[2552*9 +: 8], + INIT[2551*9 +: 8], INIT[2550*9 +: 8], INIT[2549*9 +: 8], INIT[2548*9 +: 8], + INIT[2547*9 +: 8], INIT[2546*9 +: 8], INIT[2545*9 +: 8], INIT[2544*9 +: 8], + INIT[2543*9 +: 8], INIT[2542*9 +: 8], INIT[2541*9 +: 8], INIT[2540*9 +: 8], + INIT[2539*9 +: 8], INIT[2538*9 +: 8], INIT[2537*9 +: 8], INIT[2536*9 +: 8], + INIT[2535*9 +: 8], INIT[2534*9 +: 8], INIT[2533*9 +: 8], INIT[2532*9 +: 8], + INIT[2531*9 +: 8], INIT[2530*9 +: 8], INIT[2529*9 +: 8], INIT[2528*9 +: 8]}), +.INIT_50({INIT[2591*9 +: 8], INIT[2590*9 +: 8], INIT[2589*9 +: 8], INIT[2588*9 +: 8], + INIT[2587*9 +: 8], INIT[2586*9 +: 8], INIT[2585*9 +: 8], INIT[2584*9 +: 8], + INIT[2583*9 +: 8], INIT[2582*9 +: 8], INIT[2581*9 +: 8], INIT[2580*9 +: 8], + INIT[2579*9 +: 8], INIT[2578*9 +: 8], INIT[2577*9 +: 8], INIT[2576*9 +: 8], + INIT[2575*9 +: 8], INIT[2574*9 +: 8], INIT[2573*9 +: 8], INIT[2572*9 +: 8], + INIT[2571*9 +: 8], INIT[2570*9 +: 8], INIT[2569*9 +: 8], INIT[2568*9 +: 8], + INIT[2567*9 +: 8], INIT[2566*9 +: 8], INIT[2565*9 +: 8], INIT[2564*9 +: 8], + INIT[2563*9 +: 8], INIT[2562*9 +: 8], INIT[2561*9 +: 8], INIT[2560*9 +: 8]}), +.INIT_51({INIT[2623*9 +: 8], INIT[2622*9 +: 8], INIT[2621*9 +: 8], INIT[2620*9 +: 8], + INIT[2619*9 +: 8], INIT[2618*9 +: 8], INIT[2617*9 +: 8], INIT[2616*9 +: 8], + INIT[2615*9 +: 8], INIT[2614*9 +: 8], INIT[2613*9 +: 8], INIT[2612*9 +: 8], + INIT[2611*9 +: 8], INIT[2610*9 +: 8], INIT[2609*9 +: 8], INIT[2608*9 +: 8], + INIT[2607*9 +: 8], INIT[2606*9 +: 8], INIT[2605*9 +: 8], INIT[2604*9 +: 8], + INIT[2603*9 +: 8], INIT[2602*9 +: 8], INIT[2601*9 +: 8], INIT[2600*9 +: 8], + INIT[2599*9 +: 8], INIT[2598*9 +: 8], INIT[2597*9 +: 8], INIT[2596*9 +: 8], + INIT[2595*9 +: 8], INIT[2594*9 +: 8], INIT[2593*9 +: 8], INIT[2592*9 +: 8]}), +.INIT_52({INIT[2655*9 +: 8], INIT[2654*9 +: 8], INIT[2653*9 +: 8], INIT[2652*9 +: 8], + INIT[2651*9 +: 8], INIT[2650*9 +: 8], INIT[2649*9 +: 8], INIT[2648*9 +: 8], + INIT[2647*9 +: 8], INIT[2646*9 +: 8], INIT[2645*9 +: 8], INIT[2644*9 +: 8], + INIT[2643*9 +: 8], INIT[2642*9 +: 8], INIT[2641*9 +: 8], INIT[2640*9 +: 8], + INIT[2639*9 +: 8], INIT[2638*9 +: 8], INIT[2637*9 +: 8], INIT[2636*9 +: 8], + INIT[2635*9 +: 8], INIT[2634*9 +: 8], INIT[2633*9 +: 8], INIT[2632*9 +: 8], + INIT[2631*9 +: 8], INIT[2630*9 +: 8], INIT[2629*9 +: 8], INIT[2628*9 +: 8], + INIT[2627*9 +: 8], INIT[2626*9 +: 8], INIT[2625*9 +: 8], INIT[2624*9 +: 8]}), +.INIT_53({INIT[2687*9 +: 8], INIT[2686*9 +: 8], INIT[2685*9 +: 8], INIT[2684*9 +: 8], + INIT[2683*9 +: 8], INIT[2682*9 +: 8], INIT[2681*9 +: 8], INIT[2680*9 +: 8], + INIT[2679*9 +: 8], INIT[2678*9 +: 8], INIT[2677*9 +: 8], INIT[2676*9 +: 8], + INIT[2675*9 +: 8], INIT[2674*9 +: 8], INIT[2673*9 +: 8], INIT[2672*9 +: 8], + INIT[2671*9 +: 8], INIT[2670*9 +: 8], INIT[2669*9 +: 8], INIT[2668*9 +: 8], + INIT[2667*9 +: 8], INIT[2666*9 +: 8], INIT[2665*9 +: 8], INIT[2664*9 +: 8], + INIT[2663*9 +: 8], INIT[2662*9 +: 8], INIT[2661*9 +: 8], INIT[2660*9 +: 8], + INIT[2659*9 +: 8], INIT[2658*9 +: 8], INIT[2657*9 +: 8], INIT[2656*9 +: 8]}), +.INIT_54({INIT[2719*9 +: 8], INIT[2718*9 +: 8], INIT[2717*9 +: 8], INIT[2716*9 +: 8], + INIT[2715*9 +: 8], INIT[2714*9 +: 8], INIT[2713*9 +: 8], INIT[2712*9 +: 8], + INIT[2711*9 +: 8], INIT[2710*9 +: 8], INIT[2709*9 +: 8], INIT[2708*9 +: 8], + INIT[2707*9 +: 8], INIT[2706*9 +: 8], INIT[2705*9 +: 8], INIT[2704*9 +: 8], + INIT[2703*9 +: 8], INIT[2702*9 +: 8], INIT[2701*9 +: 8], INIT[2700*9 +: 8], + INIT[2699*9 +: 8], INIT[2698*9 +: 8], INIT[2697*9 +: 8], INIT[2696*9 +: 8], + INIT[2695*9 +: 8], INIT[2694*9 +: 8], INIT[2693*9 +: 8], INIT[2692*9 +: 8], + INIT[2691*9 +: 8], INIT[2690*9 +: 8], INIT[2689*9 +: 8], INIT[2688*9 +: 8]}), +.INIT_55({INIT[2751*9 +: 8], INIT[2750*9 +: 8], INIT[2749*9 +: 8], INIT[2748*9 +: 8], + INIT[2747*9 +: 8], INIT[2746*9 +: 8], INIT[2745*9 +: 8], INIT[2744*9 +: 8], + INIT[2743*9 +: 8], INIT[2742*9 +: 8], INIT[2741*9 +: 8], INIT[2740*9 +: 8], + INIT[2739*9 +: 8], INIT[2738*9 +: 8], INIT[2737*9 +: 8], INIT[2736*9 +: 8], + INIT[2735*9 +: 8], INIT[2734*9 +: 8], INIT[2733*9 +: 8], INIT[2732*9 +: 8], + INIT[2731*9 +: 8], INIT[2730*9 +: 8], INIT[2729*9 +: 8], INIT[2728*9 +: 8], + INIT[2727*9 +: 8], INIT[2726*9 +: 8], INIT[2725*9 +: 8], INIT[2724*9 +: 8], + INIT[2723*9 +: 8], INIT[2722*9 +: 8], INIT[2721*9 +: 8], INIT[2720*9 +: 8]}), +.INIT_56({INIT[2783*9 +: 8], INIT[2782*9 +: 8], INIT[2781*9 +: 8], INIT[2780*9 +: 8], + INIT[2779*9 +: 8], INIT[2778*9 +: 8], INIT[2777*9 +: 8], INIT[2776*9 +: 8], + INIT[2775*9 +: 8], INIT[2774*9 +: 8], INIT[2773*9 +: 8], INIT[2772*9 +: 8], + INIT[2771*9 +: 8], INIT[2770*9 +: 8], INIT[2769*9 +: 8], INIT[2768*9 +: 8], + INIT[2767*9 +: 8], INIT[2766*9 +: 8], INIT[2765*9 +: 8], INIT[2764*9 +: 8], + INIT[2763*9 +: 8], INIT[2762*9 +: 8], INIT[2761*9 +: 8], INIT[2760*9 +: 8], + INIT[2759*9 +: 8], INIT[2758*9 +: 8], INIT[2757*9 +: 8], INIT[2756*9 +: 8], + INIT[2755*9 +: 8], INIT[2754*9 +: 8], INIT[2753*9 +: 8], INIT[2752*9 +: 8]}), +.INIT_57({INIT[2815*9 +: 8], INIT[2814*9 +: 8], INIT[2813*9 +: 8], INIT[2812*9 +: 8], + INIT[2811*9 +: 8], INIT[2810*9 +: 8], INIT[2809*9 +: 8], INIT[2808*9 +: 8], + INIT[2807*9 +: 8], INIT[2806*9 +: 8], INIT[2805*9 +: 8], INIT[2804*9 +: 8], + INIT[2803*9 +: 8], INIT[2802*9 +: 8], INIT[2801*9 +: 8], INIT[2800*9 +: 8], + INIT[2799*9 +: 8], INIT[2798*9 +: 8], INIT[2797*9 +: 8], INIT[2796*9 +: 8], + INIT[2795*9 +: 8], INIT[2794*9 +: 8], INIT[2793*9 +: 8], INIT[2792*9 +: 8], + INIT[2791*9 +: 8], INIT[2790*9 +: 8], INIT[2789*9 +: 8], INIT[2788*9 +: 8], + INIT[2787*9 +: 8], INIT[2786*9 +: 8], INIT[2785*9 +: 8], INIT[2784*9 +: 8]}), +.INIT_58({INIT[2847*9 +: 8], INIT[2846*9 +: 8], INIT[2845*9 +: 8], INIT[2844*9 +: 8], + INIT[2843*9 +: 8], INIT[2842*9 +: 8], INIT[2841*9 +: 8], INIT[2840*9 +: 8], + INIT[2839*9 +: 8], INIT[2838*9 +: 8], INIT[2837*9 +: 8], INIT[2836*9 +: 8], + INIT[2835*9 +: 8], INIT[2834*9 +: 8], INIT[2833*9 +: 8], INIT[2832*9 +: 8], + INIT[2831*9 +: 8], INIT[2830*9 +: 8], INIT[2829*9 +: 8], INIT[2828*9 +: 8], + INIT[2827*9 +: 8], INIT[2826*9 +: 8], INIT[2825*9 +: 8], INIT[2824*9 +: 8], + INIT[2823*9 +: 8], INIT[2822*9 +: 8], INIT[2821*9 +: 8], INIT[2820*9 +: 8], + INIT[2819*9 +: 8], INIT[2818*9 +: 8], INIT[2817*9 +: 8], INIT[2816*9 +: 8]}), +.INIT_59({INIT[2879*9 +: 8], INIT[2878*9 +: 8], INIT[2877*9 +: 8], INIT[2876*9 +: 8], + INIT[2875*9 +: 8], INIT[2874*9 +: 8], INIT[2873*9 +: 8], INIT[2872*9 +: 8], + INIT[2871*9 +: 8], INIT[2870*9 +: 8], INIT[2869*9 +: 8], INIT[2868*9 +: 8], + INIT[2867*9 +: 8], INIT[2866*9 +: 8], INIT[2865*9 +: 8], INIT[2864*9 +: 8], + INIT[2863*9 +: 8], INIT[2862*9 +: 8], INIT[2861*9 +: 8], INIT[2860*9 +: 8], + INIT[2859*9 +: 8], INIT[2858*9 +: 8], INIT[2857*9 +: 8], INIT[2856*9 +: 8], + INIT[2855*9 +: 8], INIT[2854*9 +: 8], INIT[2853*9 +: 8], INIT[2852*9 +: 8], + INIT[2851*9 +: 8], INIT[2850*9 +: 8], INIT[2849*9 +: 8], INIT[2848*9 +: 8]}), +.INIT_5A({INIT[2911*9 +: 8], INIT[2910*9 +: 8], INIT[2909*9 +: 8], INIT[2908*9 +: 8], + INIT[2907*9 +: 8], INIT[2906*9 +: 8], INIT[2905*9 +: 8], INIT[2904*9 +: 8], + INIT[2903*9 +: 8], INIT[2902*9 +: 8], INIT[2901*9 +: 8], INIT[2900*9 +: 8], + INIT[2899*9 +: 8], INIT[2898*9 +: 8], INIT[2897*9 +: 8], INIT[2896*9 +: 8], + INIT[2895*9 +: 8], INIT[2894*9 +: 8], INIT[2893*9 +: 8], INIT[2892*9 +: 8], + INIT[2891*9 +: 8], INIT[2890*9 +: 8], INIT[2889*9 +: 8], INIT[2888*9 +: 8], + INIT[2887*9 +: 8], INIT[2886*9 +: 8], INIT[2885*9 +: 8], INIT[2884*9 +: 8], + INIT[2883*9 +: 8], INIT[2882*9 +: 8], INIT[2881*9 +: 8], INIT[2880*9 +: 8]}), +.INIT_5B({INIT[2943*9 +: 8], INIT[2942*9 +: 8], INIT[2941*9 +: 8], INIT[2940*9 +: 8], + INIT[2939*9 +: 8], INIT[2938*9 +: 8], INIT[2937*9 +: 8], INIT[2936*9 +: 8], + INIT[2935*9 +: 8], INIT[2934*9 +: 8], INIT[2933*9 +: 8], INIT[2932*9 +: 8], + INIT[2931*9 +: 8], INIT[2930*9 +: 8], INIT[2929*9 +: 8], INIT[2928*9 +: 8], + INIT[2927*9 +: 8], INIT[2926*9 +: 8], INIT[2925*9 +: 8], INIT[2924*9 +: 8], + INIT[2923*9 +: 8], INIT[2922*9 +: 8], INIT[2921*9 +: 8], INIT[2920*9 +: 8], + INIT[2919*9 +: 8], INIT[2918*9 +: 8], INIT[2917*9 +: 8], INIT[2916*9 +: 8], + INIT[2915*9 +: 8], INIT[2914*9 +: 8], INIT[2913*9 +: 8], INIT[2912*9 +: 8]}), +.INIT_5C({INIT[2975*9 +: 8], INIT[2974*9 +: 8], INIT[2973*9 +: 8], INIT[2972*9 +: 8], + INIT[2971*9 +: 8], INIT[2970*9 +: 8], INIT[2969*9 +: 8], INIT[2968*9 +: 8], + INIT[2967*9 +: 8], INIT[2966*9 +: 8], INIT[2965*9 +: 8], INIT[2964*9 +: 8], + INIT[2963*9 +: 8], INIT[2962*9 +: 8], INIT[2961*9 +: 8], INIT[2960*9 +: 8], + INIT[2959*9 +: 8], INIT[2958*9 +: 8], INIT[2957*9 +: 8], INIT[2956*9 +: 8], + INIT[2955*9 +: 8], INIT[2954*9 +: 8], INIT[2953*9 +: 8], INIT[2952*9 +: 8], + INIT[2951*9 +: 8], INIT[2950*9 +: 8], INIT[2949*9 +: 8], INIT[2948*9 +: 8], + INIT[2947*9 +: 8], INIT[2946*9 +: 8], INIT[2945*9 +: 8], INIT[2944*9 +: 8]}), +.INIT_5D({INIT[3007*9 +: 8], INIT[3006*9 +: 8], INIT[3005*9 +: 8], INIT[3004*9 +: 8], + INIT[3003*9 +: 8], INIT[3002*9 +: 8], INIT[3001*9 +: 8], INIT[3000*9 +: 8], + INIT[2999*9 +: 8], INIT[2998*9 +: 8], INIT[2997*9 +: 8], INIT[2996*9 +: 8], + INIT[2995*9 +: 8], INIT[2994*9 +: 8], INIT[2993*9 +: 8], INIT[2992*9 +: 8], + INIT[2991*9 +: 8], INIT[2990*9 +: 8], INIT[2989*9 +: 8], INIT[2988*9 +: 8], + INIT[2987*9 +: 8], INIT[2986*9 +: 8], INIT[2985*9 +: 8], INIT[2984*9 +: 8], + INIT[2983*9 +: 8], INIT[2982*9 +: 8], INIT[2981*9 +: 8], INIT[2980*9 +: 8], + INIT[2979*9 +: 8], INIT[2978*9 +: 8], INIT[2977*9 +: 8], INIT[2976*9 +: 8]}), +.INIT_5E({INIT[3039*9 +: 8], INIT[3038*9 +: 8], INIT[3037*9 +: 8], INIT[3036*9 +: 8], + INIT[3035*9 +: 8], INIT[3034*9 +: 8], INIT[3033*9 +: 8], INIT[3032*9 +: 8], + INIT[3031*9 +: 8], INIT[3030*9 +: 8], INIT[3029*9 +: 8], INIT[3028*9 +: 8], + INIT[3027*9 +: 8], INIT[3026*9 +: 8], INIT[3025*9 +: 8], INIT[3024*9 +: 8], + INIT[3023*9 +: 8], INIT[3022*9 +: 8], INIT[3021*9 +: 8], INIT[3020*9 +: 8], + INIT[3019*9 +: 8], INIT[3018*9 +: 8], INIT[3017*9 +: 8], INIT[3016*9 +: 8], + INIT[3015*9 +: 8], INIT[3014*9 +: 8], INIT[3013*9 +: 8], INIT[3012*9 +: 8], + INIT[3011*9 +: 8], INIT[3010*9 +: 8], INIT[3009*9 +: 8], INIT[3008*9 +: 8]}), +.INIT_5F({INIT[3071*9 +: 8], INIT[3070*9 +: 8], INIT[3069*9 +: 8], INIT[3068*9 +: 8], + INIT[3067*9 +: 8], INIT[3066*9 +: 8], INIT[3065*9 +: 8], INIT[3064*9 +: 8], + INIT[3063*9 +: 8], INIT[3062*9 +: 8], INIT[3061*9 +: 8], INIT[3060*9 +: 8], + INIT[3059*9 +: 8], INIT[3058*9 +: 8], INIT[3057*9 +: 8], INIT[3056*9 +: 8], + INIT[3055*9 +: 8], INIT[3054*9 +: 8], INIT[3053*9 +: 8], INIT[3052*9 +: 8], + INIT[3051*9 +: 8], INIT[3050*9 +: 8], INIT[3049*9 +: 8], INIT[3048*9 +: 8], + INIT[3047*9 +: 8], INIT[3046*9 +: 8], INIT[3045*9 +: 8], INIT[3044*9 +: 8], + INIT[3043*9 +: 8], INIT[3042*9 +: 8], INIT[3041*9 +: 8], INIT[3040*9 +: 8]}), +.INIT_60({INIT[3103*9 +: 8], INIT[3102*9 +: 8], INIT[3101*9 +: 8], INIT[3100*9 +: 8], + INIT[3099*9 +: 8], INIT[3098*9 +: 8], INIT[3097*9 +: 8], INIT[3096*9 +: 8], + INIT[3095*9 +: 8], INIT[3094*9 +: 8], INIT[3093*9 +: 8], INIT[3092*9 +: 8], + INIT[3091*9 +: 8], INIT[3090*9 +: 8], INIT[3089*9 +: 8], INIT[3088*9 +: 8], + INIT[3087*9 +: 8], INIT[3086*9 +: 8], INIT[3085*9 +: 8], INIT[3084*9 +: 8], + INIT[3083*9 +: 8], INIT[3082*9 +: 8], INIT[3081*9 +: 8], INIT[3080*9 +: 8], + INIT[3079*9 +: 8], INIT[3078*9 +: 8], INIT[3077*9 +: 8], INIT[3076*9 +: 8], + INIT[3075*9 +: 8], INIT[3074*9 +: 8], INIT[3073*9 +: 8], INIT[3072*9 +: 8]}), +.INIT_61({INIT[3135*9 +: 8], INIT[3134*9 +: 8], INIT[3133*9 +: 8], INIT[3132*9 +: 8], + INIT[3131*9 +: 8], INIT[3130*9 +: 8], INIT[3129*9 +: 8], INIT[3128*9 +: 8], + INIT[3127*9 +: 8], INIT[3126*9 +: 8], INIT[3125*9 +: 8], INIT[3124*9 +: 8], + INIT[3123*9 +: 8], INIT[3122*9 +: 8], INIT[3121*9 +: 8], INIT[3120*9 +: 8], + INIT[3119*9 +: 8], INIT[3118*9 +: 8], INIT[3117*9 +: 8], INIT[3116*9 +: 8], + INIT[3115*9 +: 8], INIT[3114*9 +: 8], INIT[3113*9 +: 8], INIT[3112*9 +: 8], + INIT[3111*9 +: 8], INIT[3110*9 +: 8], INIT[3109*9 +: 8], INIT[3108*9 +: 8], + INIT[3107*9 +: 8], INIT[3106*9 +: 8], INIT[3105*9 +: 8], INIT[3104*9 +: 8]}), +.INIT_62({INIT[3167*9 +: 8], INIT[3166*9 +: 8], INIT[3165*9 +: 8], INIT[3164*9 +: 8], + INIT[3163*9 +: 8], INIT[3162*9 +: 8], INIT[3161*9 +: 8], INIT[3160*9 +: 8], + INIT[3159*9 +: 8], INIT[3158*9 +: 8], INIT[3157*9 +: 8], INIT[3156*9 +: 8], + INIT[3155*9 +: 8], INIT[3154*9 +: 8], INIT[3153*9 +: 8], INIT[3152*9 +: 8], + INIT[3151*9 +: 8], INIT[3150*9 +: 8], INIT[3149*9 +: 8], INIT[3148*9 +: 8], + INIT[3147*9 +: 8], INIT[3146*9 +: 8], INIT[3145*9 +: 8], INIT[3144*9 +: 8], + INIT[3143*9 +: 8], INIT[3142*9 +: 8], INIT[3141*9 +: 8], INIT[3140*9 +: 8], + INIT[3139*9 +: 8], INIT[3138*9 +: 8], INIT[3137*9 +: 8], INIT[3136*9 +: 8]}), +.INIT_63({INIT[3199*9 +: 8], INIT[3198*9 +: 8], INIT[3197*9 +: 8], INIT[3196*9 +: 8], + INIT[3195*9 +: 8], INIT[3194*9 +: 8], INIT[3193*9 +: 8], INIT[3192*9 +: 8], + INIT[3191*9 +: 8], INIT[3190*9 +: 8], INIT[3189*9 +: 8], INIT[3188*9 +: 8], + INIT[3187*9 +: 8], INIT[3186*9 +: 8], INIT[3185*9 +: 8], INIT[3184*9 +: 8], + INIT[3183*9 +: 8], INIT[3182*9 +: 8], INIT[3181*9 +: 8], INIT[3180*9 +: 8], + INIT[3179*9 +: 8], INIT[3178*9 +: 8], INIT[3177*9 +: 8], INIT[3176*9 +: 8], + INIT[3175*9 +: 8], INIT[3174*9 +: 8], INIT[3173*9 +: 8], INIT[3172*9 +: 8], + INIT[3171*9 +: 8], INIT[3170*9 +: 8], INIT[3169*9 +: 8], INIT[3168*9 +: 8]}), +.INIT_64({INIT[3231*9 +: 8], INIT[3230*9 +: 8], INIT[3229*9 +: 8], INIT[3228*9 +: 8], + INIT[3227*9 +: 8], INIT[3226*9 +: 8], INIT[3225*9 +: 8], INIT[3224*9 +: 8], + INIT[3223*9 +: 8], INIT[3222*9 +: 8], INIT[3221*9 +: 8], INIT[3220*9 +: 8], + INIT[3219*9 +: 8], INIT[3218*9 +: 8], INIT[3217*9 +: 8], INIT[3216*9 +: 8], + INIT[3215*9 +: 8], INIT[3214*9 +: 8], INIT[3213*9 +: 8], INIT[3212*9 +: 8], + INIT[3211*9 +: 8], INIT[3210*9 +: 8], INIT[3209*9 +: 8], INIT[3208*9 +: 8], + INIT[3207*9 +: 8], INIT[3206*9 +: 8], INIT[3205*9 +: 8], INIT[3204*9 +: 8], + INIT[3203*9 +: 8], INIT[3202*9 +: 8], INIT[3201*9 +: 8], INIT[3200*9 +: 8]}), +.INIT_65({INIT[3263*9 +: 8], INIT[3262*9 +: 8], INIT[3261*9 +: 8], INIT[3260*9 +: 8], + INIT[3259*9 +: 8], INIT[3258*9 +: 8], INIT[3257*9 +: 8], INIT[3256*9 +: 8], + INIT[3255*9 +: 8], INIT[3254*9 +: 8], INIT[3253*9 +: 8], INIT[3252*9 +: 8], + INIT[3251*9 +: 8], INIT[3250*9 +: 8], INIT[3249*9 +: 8], INIT[3248*9 +: 8], + INIT[3247*9 +: 8], INIT[3246*9 +: 8], INIT[3245*9 +: 8], INIT[3244*9 +: 8], + INIT[3243*9 +: 8], INIT[3242*9 +: 8], INIT[3241*9 +: 8], INIT[3240*9 +: 8], + INIT[3239*9 +: 8], INIT[3238*9 +: 8], INIT[3237*9 +: 8], INIT[3236*9 +: 8], + INIT[3235*9 +: 8], INIT[3234*9 +: 8], INIT[3233*9 +: 8], INIT[3232*9 +: 8]}), +.INIT_66({INIT[3295*9 +: 8], INIT[3294*9 +: 8], INIT[3293*9 +: 8], INIT[3292*9 +: 8], + INIT[3291*9 +: 8], INIT[3290*9 +: 8], INIT[3289*9 +: 8], INIT[3288*9 +: 8], + INIT[3287*9 +: 8], INIT[3286*9 +: 8], INIT[3285*9 +: 8], INIT[3284*9 +: 8], + INIT[3283*9 +: 8], INIT[3282*9 +: 8], INIT[3281*9 +: 8], INIT[3280*9 +: 8], + INIT[3279*9 +: 8], INIT[3278*9 +: 8], INIT[3277*9 +: 8], INIT[3276*9 +: 8], + INIT[3275*9 +: 8], INIT[3274*9 +: 8], INIT[3273*9 +: 8], INIT[3272*9 +: 8], + INIT[3271*9 +: 8], INIT[3270*9 +: 8], INIT[3269*9 +: 8], INIT[3268*9 +: 8], + INIT[3267*9 +: 8], INIT[3266*9 +: 8], INIT[3265*9 +: 8], INIT[3264*9 +: 8]}), +.INIT_67({INIT[3327*9 +: 8], INIT[3326*9 +: 8], INIT[3325*9 +: 8], INIT[3324*9 +: 8], + INIT[3323*9 +: 8], INIT[3322*9 +: 8], INIT[3321*9 +: 8], INIT[3320*9 +: 8], + INIT[3319*9 +: 8], INIT[3318*9 +: 8], INIT[3317*9 +: 8], INIT[3316*9 +: 8], + INIT[3315*9 +: 8], INIT[3314*9 +: 8], INIT[3313*9 +: 8], INIT[3312*9 +: 8], + INIT[3311*9 +: 8], INIT[3310*9 +: 8], INIT[3309*9 +: 8], INIT[3308*9 +: 8], + INIT[3307*9 +: 8], INIT[3306*9 +: 8], INIT[3305*9 +: 8], INIT[3304*9 +: 8], + INIT[3303*9 +: 8], INIT[3302*9 +: 8], INIT[3301*9 +: 8], INIT[3300*9 +: 8], + INIT[3299*9 +: 8], INIT[3298*9 +: 8], INIT[3297*9 +: 8], INIT[3296*9 +: 8]}), +.INIT_68({INIT[3359*9 +: 8], INIT[3358*9 +: 8], INIT[3357*9 +: 8], INIT[3356*9 +: 8], + INIT[3355*9 +: 8], INIT[3354*9 +: 8], INIT[3353*9 +: 8], INIT[3352*9 +: 8], + INIT[3351*9 +: 8], INIT[3350*9 +: 8], INIT[3349*9 +: 8], INIT[3348*9 +: 8], + INIT[3347*9 +: 8], INIT[3346*9 +: 8], INIT[3345*9 +: 8], INIT[3344*9 +: 8], + INIT[3343*9 +: 8], INIT[3342*9 +: 8], INIT[3341*9 +: 8], INIT[3340*9 +: 8], + INIT[3339*9 +: 8], INIT[3338*9 +: 8], INIT[3337*9 +: 8], INIT[3336*9 +: 8], + INIT[3335*9 +: 8], INIT[3334*9 +: 8], INIT[3333*9 +: 8], INIT[3332*9 +: 8], + INIT[3331*9 +: 8], INIT[3330*9 +: 8], INIT[3329*9 +: 8], INIT[3328*9 +: 8]}), +.INIT_69({INIT[3391*9 +: 8], INIT[3390*9 +: 8], INIT[3389*9 +: 8], INIT[3388*9 +: 8], + INIT[3387*9 +: 8], INIT[3386*9 +: 8], INIT[3385*9 +: 8], INIT[3384*9 +: 8], + INIT[3383*9 +: 8], INIT[3382*9 +: 8], INIT[3381*9 +: 8], INIT[3380*9 +: 8], + INIT[3379*9 +: 8], INIT[3378*9 +: 8], INIT[3377*9 +: 8], INIT[3376*9 +: 8], + INIT[3375*9 +: 8], INIT[3374*9 +: 8], INIT[3373*9 +: 8], INIT[3372*9 +: 8], + INIT[3371*9 +: 8], INIT[3370*9 +: 8], INIT[3369*9 +: 8], INIT[3368*9 +: 8], + INIT[3367*9 +: 8], INIT[3366*9 +: 8], INIT[3365*9 +: 8], INIT[3364*9 +: 8], + INIT[3363*9 +: 8], INIT[3362*9 +: 8], INIT[3361*9 +: 8], INIT[3360*9 +: 8]}), +.INIT_6A({INIT[3423*9 +: 8], INIT[3422*9 +: 8], INIT[3421*9 +: 8], INIT[3420*9 +: 8], + INIT[3419*9 +: 8], INIT[3418*9 +: 8], INIT[3417*9 +: 8], INIT[3416*9 +: 8], + INIT[3415*9 +: 8], INIT[3414*9 +: 8], INIT[3413*9 +: 8], INIT[3412*9 +: 8], + INIT[3411*9 +: 8], INIT[3410*9 +: 8], INIT[3409*9 +: 8], INIT[3408*9 +: 8], + INIT[3407*9 +: 8], INIT[3406*9 +: 8], INIT[3405*9 +: 8], INIT[3404*9 +: 8], + INIT[3403*9 +: 8], INIT[3402*9 +: 8], INIT[3401*9 +: 8], INIT[3400*9 +: 8], + INIT[3399*9 +: 8], INIT[3398*9 +: 8], INIT[3397*9 +: 8], INIT[3396*9 +: 8], + INIT[3395*9 +: 8], INIT[3394*9 +: 8], INIT[3393*9 +: 8], INIT[3392*9 +: 8]}), +.INIT_6B({INIT[3455*9 +: 8], INIT[3454*9 +: 8], INIT[3453*9 +: 8], INIT[3452*9 +: 8], + INIT[3451*9 +: 8], INIT[3450*9 +: 8], INIT[3449*9 +: 8], INIT[3448*9 +: 8], + INIT[3447*9 +: 8], INIT[3446*9 +: 8], INIT[3445*9 +: 8], INIT[3444*9 +: 8], + INIT[3443*9 +: 8], INIT[3442*9 +: 8], INIT[3441*9 +: 8], INIT[3440*9 +: 8], + INIT[3439*9 +: 8], INIT[3438*9 +: 8], INIT[3437*9 +: 8], INIT[3436*9 +: 8], + INIT[3435*9 +: 8], INIT[3434*9 +: 8], INIT[3433*9 +: 8], INIT[3432*9 +: 8], + INIT[3431*9 +: 8], INIT[3430*9 +: 8], INIT[3429*9 +: 8], INIT[3428*9 +: 8], + INIT[3427*9 +: 8], INIT[3426*9 +: 8], INIT[3425*9 +: 8], INIT[3424*9 +: 8]}), +.INIT_6C({INIT[3487*9 +: 8], INIT[3486*9 +: 8], INIT[3485*9 +: 8], INIT[3484*9 +: 8], + INIT[3483*9 +: 8], INIT[3482*9 +: 8], INIT[3481*9 +: 8], INIT[3480*9 +: 8], + INIT[3479*9 +: 8], INIT[3478*9 +: 8], INIT[3477*9 +: 8], INIT[3476*9 +: 8], + INIT[3475*9 +: 8], INIT[3474*9 +: 8], INIT[3473*9 +: 8], INIT[3472*9 +: 8], + INIT[3471*9 +: 8], INIT[3470*9 +: 8], INIT[3469*9 +: 8], INIT[3468*9 +: 8], + INIT[3467*9 +: 8], INIT[3466*9 +: 8], INIT[3465*9 +: 8], INIT[3464*9 +: 8], + INIT[3463*9 +: 8], INIT[3462*9 +: 8], INIT[3461*9 +: 8], INIT[3460*9 +: 8], + INIT[3459*9 +: 8], INIT[3458*9 +: 8], INIT[3457*9 +: 8], INIT[3456*9 +: 8]}), +.INIT_6D({INIT[3519*9 +: 8], INIT[3518*9 +: 8], INIT[3517*9 +: 8], INIT[3516*9 +: 8], + INIT[3515*9 +: 8], INIT[3514*9 +: 8], INIT[3513*9 +: 8], INIT[3512*9 +: 8], + INIT[3511*9 +: 8], INIT[3510*9 +: 8], INIT[3509*9 +: 8], INIT[3508*9 +: 8], + INIT[3507*9 +: 8], INIT[3506*9 +: 8], INIT[3505*9 +: 8], INIT[3504*9 +: 8], + INIT[3503*9 +: 8], INIT[3502*9 +: 8], INIT[3501*9 +: 8], INIT[3500*9 +: 8], + INIT[3499*9 +: 8], INIT[3498*9 +: 8], INIT[3497*9 +: 8], INIT[3496*9 +: 8], + INIT[3495*9 +: 8], INIT[3494*9 +: 8], INIT[3493*9 +: 8], INIT[3492*9 +: 8], + INIT[3491*9 +: 8], INIT[3490*9 +: 8], INIT[3489*9 +: 8], INIT[3488*9 +: 8]}), +.INIT_6E({INIT[3551*9 +: 8], INIT[3550*9 +: 8], INIT[3549*9 +: 8], INIT[3548*9 +: 8], + INIT[3547*9 +: 8], INIT[3546*9 +: 8], INIT[3545*9 +: 8], INIT[3544*9 +: 8], + INIT[3543*9 +: 8], INIT[3542*9 +: 8], INIT[3541*9 +: 8], INIT[3540*9 +: 8], + INIT[3539*9 +: 8], INIT[3538*9 +: 8], INIT[3537*9 +: 8], INIT[3536*9 +: 8], + INIT[3535*9 +: 8], INIT[3534*9 +: 8], INIT[3533*9 +: 8], INIT[3532*9 +: 8], + INIT[3531*9 +: 8], INIT[3530*9 +: 8], INIT[3529*9 +: 8], INIT[3528*9 +: 8], + INIT[3527*9 +: 8], INIT[3526*9 +: 8], INIT[3525*9 +: 8], INIT[3524*9 +: 8], + INIT[3523*9 +: 8], INIT[3522*9 +: 8], INIT[3521*9 +: 8], INIT[3520*9 +: 8]}), +.INIT_6F({INIT[3583*9 +: 8], INIT[3582*9 +: 8], INIT[3581*9 +: 8], INIT[3580*9 +: 8], + INIT[3579*9 +: 8], INIT[3578*9 +: 8], INIT[3577*9 +: 8], INIT[3576*9 +: 8], + INIT[3575*9 +: 8], INIT[3574*9 +: 8], INIT[3573*9 +: 8], INIT[3572*9 +: 8], + INIT[3571*9 +: 8], INIT[3570*9 +: 8], INIT[3569*9 +: 8], INIT[3568*9 +: 8], + INIT[3567*9 +: 8], INIT[3566*9 +: 8], INIT[3565*9 +: 8], INIT[3564*9 +: 8], + INIT[3563*9 +: 8], INIT[3562*9 +: 8], INIT[3561*9 +: 8], INIT[3560*9 +: 8], + INIT[3559*9 +: 8], INIT[3558*9 +: 8], INIT[3557*9 +: 8], INIT[3556*9 +: 8], + INIT[3555*9 +: 8], INIT[3554*9 +: 8], INIT[3553*9 +: 8], INIT[3552*9 +: 8]}), +.INIT_70({INIT[3615*9 +: 8], INIT[3614*9 +: 8], INIT[3613*9 +: 8], INIT[3612*9 +: 8], + INIT[3611*9 +: 8], INIT[3610*9 +: 8], INIT[3609*9 +: 8], INIT[3608*9 +: 8], + INIT[3607*9 +: 8], INIT[3606*9 +: 8], INIT[3605*9 +: 8], INIT[3604*9 +: 8], + INIT[3603*9 +: 8], INIT[3602*9 +: 8], INIT[3601*9 +: 8], INIT[3600*9 +: 8], + INIT[3599*9 +: 8], INIT[3598*9 +: 8], INIT[3597*9 +: 8], INIT[3596*9 +: 8], + INIT[3595*9 +: 8], INIT[3594*9 +: 8], INIT[3593*9 +: 8], INIT[3592*9 +: 8], + INIT[3591*9 +: 8], INIT[3590*9 +: 8], INIT[3589*9 +: 8], INIT[3588*9 +: 8], + INIT[3587*9 +: 8], INIT[3586*9 +: 8], INIT[3585*9 +: 8], INIT[3584*9 +: 8]}), +.INIT_71({INIT[3647*9 +: 8], INIT[3646*9 +: 8], INIT[3645*9 +: 8], INIT[3644*9 +: 8], + INIT[3643*9 +: 8], INIT[3642*9 +: 8], INIT[3641*9 +: 8], INIT[3640*9 +: 8], + INIT[3639*9 +: 8], INIT[3638*9 +: 8], INIT[3637*9 +: 8], INIT[3636*9 +: 8], + INIT[3635*9 +: 8], INIT[3634*9 +: 8], INIT[3633*9 +: 8], INIT[3632*9 +: 8], + INIT[3631*9 +: 8], INIT[3630*9 +: 8], INIT[3629*9 +: 8], INIT[3628*9 +: 8], + INIT[3627*9 +: 8], INIT[3626*9 +: 8], INIT[3625*9 +: 8], INIT[3624*9 +: 8], + INIT[3623*9 +: 8], INIT[3622*9 +: 8], INIT[3621*9 +: 8], INIT[3620*9 +: 8], + INIT[3619*9 +: 8], INIT[3618*9 +: 8], INIT[3617*9 +: 8], INIT[3616*9 +: 8]}), +.INIT_72({INIT[3679*9 +: 8], INIT[3678*9 +: 8], INIT[3677*9 +: 8], INIT[3676*9 +: 8], + INIT[3675*9 +: 8], INIT[3674*9 +: 8], INIT[3673*9 +: 8], INIT[3672*9 +: 8], + INIT[3671*9 +: 8], INIT[3670*9 +: 8], INIT[3669*9 +: 8], INIT[3668*9 +: 8], + INIT[3667*9 +: 8], INIT[3666*9 +: 8], INIT[3665*9 +: 8], INIT[3664*9 +: 8], + INIT[3663*9 +: 8], INIT[3662*9 +: 8], INIT[3661*9 +: 8], INIT[3660*9 +: 8], + INIT[3659*9 +: 8], INIT[3658*9 +: 8], INIT[3657*9 +: 8], INIT[3656*9 +: 8], + INIT[3655*9 +: 8], INIT[3654*9 +: 8], INIT[3653*9 +: 8], INIT[3652*9 +: 8], + INIT[3651*9 +: 8], INIT[3650*9 +: 8], INIT[3649*9 +: 8], INIT[3648*9 +: 8]}), +.INIT_73({INIT[3711*9 +: 8], INIT[3710*9 +: 8], INIT[3709*9 +: 8], INIT[3708*9 +: 8], + INIT[3707*9 +: 8], INIT[3706*9 +: 8], INIT[3705*9 +: 8], INIT[3704*9 +: 8], + INIT[3703*9 +: 8], INIT[3702*9 +: 8], INIT[3701*9 +: 8], INIT[3700*9 +: 8], + INIT[3699*9 +: 8], INIT[3698*9 +: 8], INIT[3697*9 +: 8], INIT[3696*9 +: 8], + INIT[3695*9 +: 8], INIT[3694*9 +: 8], INIT[3693*9 +: 8], INIT[3692*9 +: 8], + INIT[3691*9 +: 8], INIT[3690*9 +: 8], INIT[3689*9 +: 8], INIT[3688*9 +: 8], + INIT[3687*9 +: 8], INIT[3686*9 +: 8], INIT[3685*9 +: 8], INIT[3684*9 +: 8], + INIT[3683*9 +: 8], INIT[3682*9 +: 8], INIT[3681*9 +: 8], INIT[3680*9 +: 8]}), +.INIT_74({INIT[3743*9 +: 8], INIT[3742*9 +: 8], INIT[3741*9 +: 8], INIT[3740*9 +: 8], + INIT[3739*9 +: 8], INIT[3738*9 +: 8], INIT[3737*9 +: 8], INIT[3736*9 +: 8], + INIT[3735*9 +: 8], INIT[3734*9 +: 8], INIT[3733*9 +: 8], INIT[3732*9 +: 8], + INIT[3731*9 +: 8], INIT[3730*9 +: 8], INIT[3729*9 +: 8], INIT[3728*9 +: 8], + INIT[3727*9 +: 8], INIT[3726*9 +: 8], INIT[3725*9 +: 8], INIT[3724*9 +: 8], + INIT[3723*9 +: 8], INIT[3722*9 +: 8], INIT[3721*9 +: 8], INIT[3720*9 +: 8], + INIT[3719*9 +: 8], INIT[3718*9 +: 8], INIT[3717*9 +: 8], INIT[3716*9 +: 8], + INIT[3715*9 +: 8], INIT[3714*9 +: 8], INIT[3713*9 +: 8], INIT[3712*9 +: 8]}), +.INIT_75({INIT[3775*9 +: 8], INIT[3774*9 +: 8], INIT[3773*9 +: 8], INIT[3772*9 +: 8], + INIT[3771*9 +: 8], INIT[3770*9 +: 8], INIT[3769*9 +: 8], INIT[3768*9 +: 8], + INIT[3767*9 +: 8], INIT[3766*9 +: 8], INIT[3765*9 +: 8], INIT[3764*9 +: 8], + INIT[3763*9 +: 8], INIT[3762*9 +: 8], INIT[3761*9 +: 8], INIT[3760*9 +: 8], + INIT[3759*9 +: 8], INIT[3758*9 +: 8], INIT[3757*9 +: 8], INIT[3756*9 +: 8], + INIT[3755*9 +: 8], INIT[3754*9 +: 8], INIT[3753*9 +: 8], INIT[3752*9 +: 8], + INIT[3751*9 +: 8], INIT[3750*9 +: 8], INIT[3749*9 +: 8], INIT[3748*9 +: 8], + INIT[3747*9 +: 8], INIT[3746*9 +: 8], INIT[3745*9 +: 8], INIT[3744*9 +: 8]}), +.INIT_76({INIT[3807*9 +: 8], INIT[3806*9 +: 8], INIT[3805*9 +: 8], INIT[3804*9 +: 8], + INIT[3803*9 +: 8], INIT[3802*9 +: 8], INIT[3801*9 +: 8], INIT[3800*9 +: 8], + INIT[3799*9 +: 8], INIT[3798*9 +: 8], INIT[3797*9 +: 8], INIT[3796*9 +: 8], + INIT[3795*9 +: 8], INIT[3794*9 +: 8], INIT[3793*9 +: 8], INIT[3792*9 +: 8], + INIT[3791*9 +: 8], INIT[3790*9 +: 8], INIT[3789*9 +: 8], INIT[3788*9 +: 8], + INIT[3787*9 +: 8], INIT[3786*9 +: 8], INIT[3785*9 +: 8], INIT[3784*9 +: 8], + INIT[3783*9 +: 8], INIT[3782*9 +: 8], INIT[3781*9 +: 8], INIT[3780*9 +: 8], + INIT[3779*9 +: 8], INIT[3778*9 +: 8], INIT[3777*9 +: 8], INIT[3776*9 +: 8]}), +.INIT_77({INIT[3839*9 +: 8], INIT[3838*9 +: 8], INIT[3837*9 +: 8], INIT[3836*9 +: 8], + INIT[3835*9 +: 8], INIT[3834*9 +: 8], INIT[3833*9 +: 8], INIT[3832*9 +: 8], + INIT[3831*9 +: 8], INIT[3830*9 +: 8], INIT[3829*9 +: 8], INIT[3828*9 +: 8], + INIT[3827*9 +: 8], INIT[3826*9 +: 8], INIT[3825*9 +: 8], INIT[3824*9 +: 8], + INIT[3823*9 +: 8], INIT[3822*9 +: 8], INIT[3821*9 +: 8], INIT[3820*9 +: 8], + INIT[3819*9 +: 8], INIT[3818*9 +: 8], INIT[3817*9 +: 8], INIT[3816*9 +: 8], + INIT[3815*9 +: 8], INIT[3814*9 +: 8], INIT[3813*9 +: 8], INIT[3812*9 +: 8], + INIT[3811*9 +: 8], INIT[3810*9 +: 8], INIT[3809*9 +: 8], INIT[3808*9 +: 8]}), +.INIT_78({INIT[3871*9 +: 8], INIT[3870*9 +: 8], INIT[3869*9 +: 8], INIT[3868*9 +: 8], + INIT[3867*9 +: 8], INIT[3866*9 +: 8], INIT[3865*9 +: 8], INIT[3864*9 +: 8], + INIT[3863*9 +: 8], INIT[3862*9 +: 8], INIT[3861*9 +: 8], INIT[3860*9 +: 8], + INIT[3859*9 +: 8], INIT[3858*9 +: 8], INIT[3857*9 +: 8], INIT[3856*9 +: 8], + INIT[3855*9 +: 8], INIT[3854*9 +: 8], INIT[3853*9 +: 8], INIT[3852*9 +: 8], + INIT[3851*9 +: 8], INIT[3850*9 +: 8], INIT[3849*9 +: 8], INIT[3848*9 +: 8], + INIT[3847*9 +: 8], INIT[3846*9 +: 8], INIT[3845*9 +: 8], INIT[3844*9 +: 8], + INIT[3843*9 +: 8], INIT[3842*9 +: 8], INIT[3841*9 +: 8], INIT[3840*9 +: 8]}), +.INIT_79({INIT[3903*9 +: 8], INIT[3902*9 +: 8], INIT[3901*9 +: 8], INIT[3900*9 +: 8], + INIT[3899*9 +: 8], INIT[3898*9 +: 8], INIT[3897*9 +: 8], INIT[3896*9 +: 8], + INIT[3895*9 +: 8], INIT[3894*9 +: 8], INIT[3893*9 +: 8], INIT[3892*9 +: 8], + INIT[3891*9 +: 8], INIT[3890*9 +: 8], INIT[3889*9 +: 8], INIT[3888*9 +: 8], + INIT[3887*9 +: 8], INIT[3886*9 +: 8], INIT[3885*9 +: 8], INIT[3884*9 +: 8], + INIT[3883*9 +: 8], INIT[3882*9 +: 8], INIT[3881*9 +: 8], INIT[3880*9 +: 8], + INIT[3879*9 +: 8], INIT[3878*9 +: 8], INIT[3877*9 +: 8], INIT[3876*9 +: 8], + INIT[3875*9 +: 8], INIT[3874*9 +: 8], INIT[3873*9 +: 8], INIT[3872*9 +: 8]}), +.INIT_7A({INIT[3935*9 +: 8], INIT[3934*9 +: 8], INIT[3933*9 +: 8], INIT[3932*9 +: 8], + INIT[3931*9 +: 8], INIT[3930*9 +: 8], INIT[3929*9 +: 8], INIT[3928*9 +: 8], + INIT[3927*9 +: 8], INIT[3926*9 +: 8], INIT[3925*9 +: 8], INIT[3924*9 +: 8], + INIT[3923*9 +: 8], INIT[3922*9 +: 8], INIT[3921*9 +: 8], INIT[3920*9 +: 8], + INIT[3919*9 +: 8], INIT[3918*9 +: 8], INIT[3917*9 +: 8], INIT[3916*9 +: 8], + INIT[3915*9 +: 8], INIT[3914*9 +: 8], INIT[3913*9 +: 8], INIT[3912*9 +: 8], + INIT[3911*9 +: 8], INIT[3910*9 +: 8], INIT[3909*9 +: 8], INIT[3908*9 +: 8], + INIT[3907*9 +: 8], INIT[3906*9 +: 8], INIT[3905*9 +: 8], INIT[3904*9 +: 8]}), +.INIT_7B({INIT[3967*9 +: 8], INIT[3966*9 +: 8], INIT[3965*9 +: 8], INIT[3964*9 +: 8], + INIT[3963*9 +: 8], INIT[3962*9 +: 8], INIT[3961*9 +: 8], INIT[3960*9 +: 8], + INIT[3959*9 +: 8], INIT[3958*9 +: 8], INIT[3957*9 +: 8], INIT[3956*9 +: 8], + INIT[3955*9 +: 8], INIT[3954*9 +: 8], INIT[3953*9 +: 8], INIT[3952*9 +: 8], + INIT[3951*9 +: 8], INIT[3950*9 +: 8], INIT[3949*9 +: 8], INIT[3948*9 +: 8], + INIT[3947*9 +: 8], INIT[3946*9 +: 8], INIT[3945*9 +: 8], INIT[3944*9 +: 8], + INIT[3943*9 +: 8], INIT[3942*9 +: 8], INIT[3941*9 +: 8], INIT[3940*9 +: 8], + INIT[3939*9 +: 8], INIT[3938*9 +: 8], INIT[3937*9 +: 8], INIT[3936*9 +: 8]}), +.INIT_7C({INIT[3999*9 +: 8], INIT[3998*9 +: 8], INIT[3997*9 +: 8], INIT[3996*9 +: 8], + INIT[3995*9 +: 8], INIT[3994*9 +: 8], INIT[3993*9 +: 8], INIT[3992*9 +: 8], + INIT[3991*9 +: 8], INIT[3990*9 +: 8], INIT[3989*9 +: 8], INIT[3988*9 +: 8], + INIT[3987*9 +: 8], INIT[3986*9 +: 8], INIT[3985*9 +: 8], INIT[3984*9 +: 8], + INIT[3983*9 +: 8], INIT[3982*9 +: 8], INIT[3981*9 +: 8], INIT[3980*9 +: 8], + INIT[3979*9 +: 8], INIT[3978*9 +: 8], INIT[3977*9 +: 8], INIT[3976*9 +: 8], + INIT[3975*9 +: 8], INIT[3974*9 +: 8], INIT[3973*9 +: 8], INIT[3972*9 +: 8], + INIT[3971*9 +: 8], INIT[3970*9 +: 8], INIT[3969*9 +: 8], INIT[3968*9 +: 8]}), +.INIT_7D({INIT[4031*9 +: 8], INIT[4030*9 +: 8], INIT[4029*9 +: 8], INIT[4028*9 +: 8], + INIT[4027*9 +: 8], INIT[4026*9 +: 8], INIT[4025*9 +: 8], INIT[4024*9 +: 8], + INIT[4023*9 +: 8], INIT[4022*9 +: 8], INIT[4021*9 +: 8], INIT[4020*9 +: 8], + INIT[4019*9 +: 8], INIT[4018*9 +: 8], INIT[4017*9 +: 8], INIT[4016*9 +: 8], + INIT[4015*9 +: 8], INIT[4014*9 +: 8], INIT[4013*9 +: 8], INIT[4012*9 +: 8], + INIT[4011*9 +: 8], INIT[4010*9 +: 8], INIT[4009*9 +: 8], INIT[4008*9 +: 8], + INIT[4007*9 +: 8], INIT[4006*9 +: 8], INIT[4005*9 +: 8], INIT[4004*9 +: 8], + INIT[4003*9 +: 8], INIT[4002*9 +: 8], INIT[4001*9 +: 8], INIT[4000*9 +: 8]}), +.INIT_7E({INIT[4063*9 +: 8], INIT[4062*9 +: 8], INIT[4061*9 +: 8], INIT[4060*9 +: 8], + INIT[4059*9 +: 8], INIT[4058*9 +: 8], INIT[4057*9 +: 8], INIT[4056*9 +: 8], + INIT[4055*9 +: 8], INIT[4054*9 +: 8], INIT[4053*9 +: 8], INIT[4052*9 +: 8], + INIT[4051*9 +: 8], INIT[4050*9 +: 8], INIT[4049*9 +: 8], INIT[4048*9 +: 8], + INIT[4047*9 +: 8], INIT[4046*9 +: 8], INIT[4045*9 +: 8], INIT[4044*9 +: 8], + INIT[4043*9 +: 8], INIT[4042*9 +: 8], INIT[4041*9 +: 8], INIT[4040*9 +: 8], + INIT[4039*9 +: 8], INIT[4038*9 +: 8], INIT[4037*9 +: 8], INIT[4036*9 +: 8], + INIT[4035*9 +: 8], INIT[4034*9 +: 8], INIT[4033*9 +: 8], INIT[4032*9 +: 8]}), +.INIT_7F({INIT[4095*9 +: 8], INIT[4094*9 +: 8], INIT[4093*9 +: 8], INIT[4092*9 +: 8], + INIT[4091*9 +: 8], INIT[4090*9 +: 8], INIT[4089*9 +: 8], INIT[4088*9 +: 8], + INIT[4087*9 +: 8], INIT[4086*9 +: 8], INIT[4085*9 +: 8], INIT[4084*9 +: 8], + INIT[4083*9 +: 8], INIT[4082*9 +: 8], INIT[4081*9 +: 8], INIT[4080*9 +: 8], + INIT[4079*9 +: 8], INIT[4078*9 +: 8], INIT[4077*9 +: 8], INIT[4076*9 +: 8], + INIT[4075*9 +: 8], INIT[4074*9 +: 8], INIT[4073*9 +: 8], INIT[4072*9 +: 8], + INIT[4071*9 +: 8], INIT[4070*9 +: 8], INIT[4069*9 +: 8], INIT[4068*9 +: 8], + INIT[4067*9 +: 8], INIT[4066*9 +: 8], INIT[4065*9 +: 8], INIT[4064*9 +: 8]}), diff --git a/verilog/windows/autoyosys/share/xilinx/brams_map.v b/verilog/windows/autoyosys/share/xilinx/brams_map.v new file mode 100644 index 0000000..7ea4915 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/brams_map.v @@ -0,0 +1,359 @@ +module \$__XILINX_RAMB36_SDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); + parameter CLKPOL2 = 1; + parameter CLKPOL3 = 1; + parameter [36863:0] INIT = 36864'bx; + + input CLK2; + input CLK3; + + input [8:0] A1ADDR; + output [71:0] A1DATA; + input A1EN; + + input [8:0] B1ADDR; + input [71:0] B1DATA; + input [7:0] B1EN; + + wire [15:0] A1ADDR_16 = {A1ADDR, 6'b0}; + wire [15:0] B1ADDR_16 = {B1ADDR, 6'b0}; + + wire [7:0] DIP, DOP; + wire [63:0] DI, DO; + + assign A1DATA = { DOP[7], DO[63:56], DOP[6], DO[55:48], DOP[5], DO[47:40], DOP[4], DO[39:32], + DOP[3], DO[31:24], DOP[2], DO[23:16], DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] }; + + assign { DIP[7], DI[63:56], DIP[6], DI[55:48], DIP[5], DI[47:40], DIP[4], DI[39:32], + DIP[3], DI[31:24], DIP[2], DI[23:16], DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA; + + RAMB36E1 #( + .RAM_MODE("SDP"), + .READ_WIDTH_A(72), + .WRITE_WIDTH_B(72), + .WRITE_MODE_A("READ_FIRST"), + .WRITE_MODE_B("READ_FIRST"), + .IS_CLKARDCLK_INVERTED(!CLKPOL2), + .IS_CLKBWRCLK_INVERTED(!CLKPOL3), + `include "brams_init_36.vh" + .SIM_DEVICE("7SERIES") + ) _TECHMAP_REPLACE_ ( + .DOBDO(DO[63:32]), + .DOADO(DO[31:0]), + .DOPBDOP(DOP[7:4]), + .DOPADOP(DOP[3:0]), + .DIBDI(DI[63:32]), + .DIADI(DI[31:0]), + .DIPBDIP(DIP[7:4]), + .DIPADIP(DIP[3:0]), + + .ADDRARDADDR(A1ADDR_16), + .CLKARDCLK(CLK2), + .ENARDEN(A1EN), + .REGCEAREGCE(|1), + .RSTRAMARSTRAM(|0), + .RSTREGARSTREG(|0), + .WEA(4'b0), + + .ADDRBWRADDR(B1ADDR_16), + .CLKBWRCLK(CLK3), + .ENBWREN(|1), + .REGCEB(|0), + .RSTRAMB(|0), + .RSTREGB(|0), + .WEBWE(B1EN) + ); +endmodule + +// ------------------------------------------------------------------------ + +module \$__XILINX_RAMB18_SDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); + parameter CLKPOL2 = 1; + parameter CLKPOL3 = 1; + parameter [18431:0] INIT = 18432'bx; + + input CLK2; + input CLK3; + + input [8:0] A1ADDR; + output [35:0] A1DATA; + input A1EN; + + input [8:0] B1ADDR; + input [35:0] B1DATA; + input [3:0] B1EN; + + wire [13:0] A1ADDR_14 = {A1ADDR, 5'b0}; + wire [13:0] B1ADDR_14 = {B1ADDR, 5'b0}; + + wire [3:0] DIP, DOP; + wire [31:0] DI, DO; + + assign A1DATA = { DOP[3], DO[31:24], DOP[2], DO[23:16], DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] }; + assign { DIP[3], DI[31:24], DIP[2], DI[23:16], DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA; + + RAMB18E1 #( + .RAM_MODE("SDP"), + .READ_WIDTH_A(36), + .WRITE_WIDTH_B(36), + .WRITE_MODE_A("READ_FIRST"), + .WRITE_MODE_B("READ_FIRST"), + .IS_CLKARDCLK_INVERTED(!CLKPOL2), + .IS_CLKBWRCLK_INVERTED(!CLKPOL3), + `include "brams_init_18.vh" + .SIM_DEVICE("7SERIES") + ) _TECHMAP_REPLACE_ ( + .DOBDO(DO[31:16]), + .DOADO(DO[15:0]), + .DOPBDOP(DOP[3:2]), + .DOPADOP(DOP[1:0]), + .DIBDI(DI[31:16]), + .DIADI(DI[15:0]), + .DIPBDIP(DIP[3:2]), + .DIPADIP(DIP[1:0]), + + .ADDRARDADDR(A1ADDR_14), + .CLKARDCLK(CLK2), + .ENARDEN(A1EN), + .REGCEAREGCE(|1), + .RSTRAMARSTRAM(|0), + .RSTREGARSTREG(|0), + .WEA(2'b0), + + .ADDRBWRADDR(B1ADDR_14), + .CLKBWRCLK(CLK3), + .ENBWREN(|1), + .REGCEB(|0), + .RSTRAMB(|0), + .RSTREGB(|0), + .WEBWE(B1EN) + ); +endmodule + +// ------------------------------------------------------------------------ + +module \$__XILINX_RAMB36_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); + parameter CFG_ABITS = 10; + parameter CFG_DBITS = 36; + parameter CFG_ENABLE_B = 4; + + parameter CLKPOL2 = 1; + parameter CLKPOL3 = 1; + parameter [36863:0] INIT = 36864'bx; + + input CLK2; + input CLK3; + + input [CFG_ABITS-1:0] A1ADDR; + output [CFG_DBITS-1:0] A1DATA; + input A1EN; + + input [CFG_ABITS-1:0] B1ADDR; + input [CFG_DBITS-1:0] B1DATA; + input [CFG_ENABLE_B-1:0] B1EN; + + wire [15:0] A1ADDR_16 = A1ADDR << (15 - CFG_ABITS); + wire [15:0] B1ADDR_16 = B1ADDR << (15 - CFG_ABITS); + wire [7:0] B1EN_8 = B1EN; + + wire [3:0] DIP, DOP; + wire [31:0] DI, DO; + + wire [31:0] DOBDO; + wire [3:0] DOPBDOP; + + assign A1DATA = { DOP[3], DO[31:24], DOP[2], DO[23:16], DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] }; + assign { DIP[3], DI[31:24], DIP[2], DI[23:16], DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA; + + generate if (CFG_DBITS > 8) begin + RAMB36E1 #( + .RAM_MODE("TDP"), + .READ_WIDTH_A(CFG_DBITS), + .READ_WIDTH_B(CFG_DBITS), + .WRITE_WIDTH_A(CFG_DBITS), + .WRITE_WIDTH_B(CFG_DBITS), + .WRITE_MODE_A("READ_FIRST"), + .WRITE_MODE_B("READ_FIRST"), + .IS_CLKARDCLK_INVERTED(!CLKPOL2), + .IS_CLKBWRCLK_INVERTED(!CLKPOL3), + `include "brams_init_36.vh" + .SIM_DEVICE("7SERIES") + ) _TECHMAP_REPLACE_ ( + .DIADI(32'd0), + .DIPADIP(4'd0), + .DOADO(DO[31:0]), + .DOPADOP(DOP[3:0]), + .ADDRARDADDR(A1ADDR_16), + .CLKARDCLK(CLK2), + .ENARDEN(A1EN), + .REGCEAREGCE(|1), + .RSTRAMARSTRAM(|0), + .RSTREGARSTREG(|0), + .WEA(4'b0), + + .DIBDI(DI), + .DIPBDIP(DIP), + .DOBDO(DOBDO), + .DOPBDOP(DOPBDOP), + .ADDRBWRADDR(B1ADDR_16), + .CLKBWRCLK(CLK3), + .ENBWREN(|1), + .REGCEB(|0), + .RSTRAMB(|0), + .RSTREGB(|0), + .WEBWE(B1EN_8) + ); + end else begin + RAMB36E1 #( + .RAM_MODE("TDP"), + .READ_WIDTH_A(CFG_DBITS), + .READ_WIDTH_B(CFG_DBITS), + .WRITE_WIDTH_A(CFG_DBITS), + .WRITE_WIDTH_B(CFG_DBITS), + .WRITE_MODE_A("READ_FIRST"), + .WRITE_MODE_B("READ_FIRST"), + .IS_CLKARDCLK_INVERTED(!CLKPOL2), + .IS_CLKBWRCLK_INVERTED(!CLKPOL3), + `include "brams_init_32.vh" + .SIM_DEVICE("7SERIES") + ) _TECHMAP_REPLACE_ ( + .DIADI(32'd0), + .DIPADIP(4'd0), + .DOADO(DO[31:0]), + .DOPADOP(DOP[3:0]), + .ADDRARDADDR(A1ADDR_16), + .CLKARDCLK(CLK2), + .ENARDEN(A1EN), + .REGCEAREGCE(|1), + .RSTRAMARSTRAM(|0), + .RSTREGARSTREG(|0), + .WEA(4'b0), + + .DIBDI(DI), + .DIPBDIP(DIP), + .DOBDO(DOBDO), + .DOPBDOP(DOPBDOP), + .ADDRBWRADDR(B1ADDR_16), + .CLKBWRCLK(CLK3), + .ENBWREN(|1), + .REGCEB(|0), + .RSTRAMB(|0), + .RSTREGB(|0), + .WEBWE(B1EN_8) + ); + end endgenerate +endmodule + +// ------------------------------------------------------------------------ + +module \$__XILINX_RAMB18_TDP (CLK2, CLK3, A1ADDR, A1DATA, A1EN, B1ADDR, B1DATA, B1EN); + parameter CFG_ABITS = 10; + parameter CFG_DBITS = 18; + parameter CFG_ENABLE_B = 2; + + parameter CLKPOL2 = 1; + parameter CLKPOL3 = 1; + parameter [18431:0] INIT = 18432'bx; + + input CLK2; + input CLK3; + + input [CFG_ABITS-1:0] A1ADDR; + output [CFG_DBITS-1:0] A1DATA; + input A1EN; + + input [CFG_ABITS-1:0] B1ADDR; + input [CFG_DBITS-1:0] B1DATA; + input [CFG_ENABLE_B-1:0] B1EN; + + wire [13:0] A1ADDR_14 = A1ADDR << (14 - CFG_ABITS); + wire [13:0] B1ADDR_14 = B1ADDR << (14 - CFG_ABITS); + wire [3:0] B1EN_4 = B1EN; + + wire [1:0] DIP, DOP; + wire [15:0] DI, DO; + + wire [15:0] DOBDO; + wire [1:0] DOPBDOP; + + assign A1DATA = { DOP[1], DO[15: 8], DOP[0], DO[ 7: 0] }; + assign { DIP[1], DI[15: 8], DIP[0], DI[ 7: 0] } = B1DATA; + + generate if (CFG_DBITS > 8) begin + RAMB18E1 #( + .RAM_MODE("TDP"), + .READ_WIDTH_A(CFG_DBITS), + .READ_WIDTH_B(CFG_DBITS), + .WRITE_WIDTH_A(CFG_DBITS), + .WRITE_WIDTH_B(CFG_DBITS), + .WRITE_MODE_A("READ_FIRST"), + .WRITE_MODE_B("READ_FIRST"), + .IS_CLKARDCLK_INVERTED(!CLKPOL2), + .IS_CLKBWRCLK_INVERTED(!CLKPOL3), + `include "brams_init_18.vh" + .SIM_DEVICE("7SERIES") + ) _TECHMAP_REPLACE_ ( + .DIADI(16'b0), + .DIPADIP(2'b0), + .DOADO(DO), + .DOPADOP(DOP), + .ADDRARDADDR(A1ADDR_14), + .CLKARDCLK(CLK2), + .ENARDEN(A1EN), + .REGCEAREGCE(|1), + .RSTRAMARSTRAM(|0), + .RSTREGARSTREG(|0), + .WEA(2'b0), + + .DIBDI(DI), + .DIPBDIP(DIP), + .DOBDO(DOBDO), + .DOPBDOP(DOPBDOP), + .ADDRBWRADDR(B1ADDR_14), + .CLKBWRCLK(CLK3), + .ENBWREN(|1), + .REGCEB(|0), + .RSTRAMB(|0), + .RSTREGB(|0), + .WEBWE(B1EN_4) + ); + end else begin + RAMB18E1 #( + .RAM_MODE("TDP"), + .READ_WIDTH_A(CFG_DBITS), + .READ_WIDTH_B(CFG_DBITS), + .WRITE_WIDTH_A(CFG_DBITS), + .WRITE_WIDTH_B(CFG_DBITS), + .WRITE_MODE_A("READ_FIRST"), + .WRITE_MODE_B("READ_FIRST"), + .IS_CLKARDCLK_INVERTED(!CLKPOL2), + .IS_CLKBWRCLK_INVERTED(!CLKPOL3), + `include "brams_init_16.vh" + .SIM_DEVICE("7SERIES") + ) _TECHMAP_REPLACE_ ( + .DIADI(16'b0), + .DIPADIP(2'b0), + .DOADO(DO), + .DOPADOP(DOP), + .ADDRARDADDR(A1ADDR_14), + .CLKARDCLK(CLK2), + .ENARDEN(A1EN), + .REGCEAREGCE(|1), + .RSTRAMARSTRAM(|0), + .RSTREGARSTREG(|0), + .WEA(2'b0), + + .DIBDI(DI), + .DIPBDIP(DIP), + .DOBDO(DOBDO), + .DOPBDOP(DOPBDOP), + .ADDRBWRADDR(B1ADDR_14), + .CLKBWRCLK(CLK3), + .ENBWREN(|1), + .REGCEB(|0), + .RSTRAMB(|0), + .RSTREGB(|0), + .WEBWE(B1EN_4) + ); + end endgenerate +endmodule + diff --git a/verilog/windows/autoyosys/share/xilinx/cells_map.v b/verilog/windows/autoyosys/share/xilinx/cells_map.v new file mode 100644 index 0000000..8e5a83c --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/cells_map.v @@ -0,0 +1,84 @@ + +module \$_DFF_N_ (input D, C, output Q); FDRE #(.INIT(|0), .IS_C_INVERTED(|1), .IS_D_INVERTED(|0), .IS_R_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R(1'b0)); endmodule +module \$_DFF_P_ (input D, C, output Q); FDRE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_R_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R(1'b0)); endmodule + +module \$_DFFE_NP_ (input D, C, E, output Q); FDRE #(.INIT(|0), .IS_C_INVERTED(|1), .IS_D_INVERTED(|0), .IS_R_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R(1'b0)); endmodule +module \$_DFFE_PP_ (input D, C, E, output Q); FDRE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_R_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R(1'b0)); endmodule + +module \$_DFF_NN0_ (input D, C, R, output Q); FDCE #(.INIT(|0), .IS_C_INVERTED(|1), .IS_D_INVERTED(|0), .IS_CLR_INVERTED(|1)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR(R)); endmodule +module \$_DFF_NP0_ (input D, C, R, output Q); FDCE #(.INIT(|0), .IS_C_INVERTED(|1), .IS_D_INVERTED(|0), .IS_CLR_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR(R)); endmodule +module \$_DFF_PN0_ (input D, C, R, output Q); FDCE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_CLR_INVERTED(|1)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR(R)); endmodule +module \$_DFF_PP0_ (input D, C, R, output Q); FDCE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_CLR_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR(R)); endmodule + +module \$_DFF_NN1_ (input D, C, R, output Q); FDPE #(.INIT(|0), .IS_C_INVERTED(|1), .IS_D_INVERTED(|0), .IS_PRE_INVERTED(|1)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(R)); endmodule +module \$_DFF_NP1_ (input D, C, R, output Q); FDPE #(.INIT(|0), .IS_C_INVERTED(|1), .IS_D_INVERTED(|0), .IS_PRE_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(R)); endmodule +module \$_DFF_PN1_ (input D, C, R, output Q); FDPE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_PRE_INVERTED(|1)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(R)); endmodule +module \$_DFF_PP1_ (input D, C, R, output Q); FDPE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_PRE_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(R)); endmodule + +module \$lut (A, Y); + parameter WIDTH = 0; + parameter LUT = 0; + + input [WIDTH-1:0] A; + output Y; + + generate + if (WIDTH == 1) begin + LUT1 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0])); + end else + if (WIDTH == 2) begin + LUT2 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0]), .I1(A[1])); + end else + if (WIDTH == 3) begin + LUT3 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0]), .I1(A[1]), .I2(A[2])); + end else + if (WIDTH == 4) begin + LUT4 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0]), .I1(A[1]), .I2(A[2]), + .I3(A[3])); + end else + if (WIDTH == 5) begin + LUT5 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0]), .I1(A[1]), .I2(A[2]), + .I3(A[3]), .I4(A[4])); + end else + if (WIDTH == 6) begin + LUT6 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.O(Y), + .I0(A[0]), .I1(A[1]), .I2(A[2]), + .I3(A[3]), .I4(A[4]), .I5(A[5])); + end else + if (WIDTH == 7) begin + wire T0, T1; + LUT6 #(.INIT(LUT[63:0])) fpga_lut_0 (.O(T0), + .I0(A[0]), .I1(A[1]), .I2(A[2]), + .I3(A[3]), .I4(A[4]), .I5(A[5])); + LUT6 #(.INIT(LUT[127:64])) fpga_lut_1 (.O(T1), + .I0(A[0]), .I1(A[1]), .I2(A[2]), + .I3(A[3]), .I4(A[4]), .I5(A[5])); + MUXF7 fpga_mux_0 (.O(Y), .I0(T0), .I1(T1), .S(A[6])); + end else + if (WIDTH == 8) begin + wire T0, T1, T2, T3, T4, T5; + LUT6 #(.INIT(LUT[63:0])) fpga_lut_0 (.O(T0), + .I0(A[0]), .I1(A[1]), .I2(A[2]), + .I3(A[3]), .I4(A[4]), .I5(A[5])); + LUT6 #(.INIT(LUT[127:64])) fpga_lut_1 (.O(T1), + .I0(A[0]), .I1(A[1]), .I2(A[2]), + .I3(A[3]), .I4(A[4]), .I5(A[5])); + LUT6 #(.INIT(LUT[191:128])) fpga_lut_2 (.O(T2), + .I0(A[0]), .I1(A[1]), .I2(A[2]), + .I3(A[3]), .I4(A[4]), .I5(A[5])); + LUT6 #(.INIT(LUT[255:192])) fpga_lut_3 (.O(T3), + .I0(A[0]), .I1(A[1]), .I2(A[2]), + .I3(A[3]), .I4(A[4]), .I5(A[5])); + MUXF7 fpga_mux_0 (.O(T4), .I0(T0), .I1(T1), .S(A[6])); + MUXF7 fpga_mux_1 (.O(T5), .I0(T2), .I1(T3), .S(A[6])); + MUXF8 fpga_mux_2 (.O(Y), .I0(T4), .I1(T5), .S(A[7])); + end else begin + wire _TECHMAP_FAIL_ = 1; + end + endgenerate +endmodule diff --git a/verilog/windows/autoyosys/share/xilinx/cells_sim.v b/verilog/windows/autoyosys/share/xilinx/cells_sim.v new file mode 100644 index 0000000..1f114a2 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/cells_sim.v @@ -0,0 +1,158 @@ + +// See Xilinx UG953 and UG474 for a description of the cell types below. +// http://www.xilinx.com/support/documentation/user_guides/ug474_7Series_CLB.pdf +// http://www.xilinx.com/support/documentation/sw_manuals/xilinx2014_4/ug953-vivado-7series-libraries.pdf + +module VCC(output P); + assign P = 1; +endmodule + +module GND(output G); + assign G = 0; +endmodule + +module IBUF(output O, input I); + assign O = I; +endmodule + +module OBUF(output O, input I); + assign O = I; +endmodule + +module BUFG(output O, input I); + assign O = I; +endmodule + +// module OBUFT(output O, input I, T); +// assign O = T ? 1'bz : I; +// endmodule + +// module IOBUF(inout IO, output O, input I, T); +// assign O = IO, IO = T ? 1'bz : I; +// endmodule + +module INV(output O, input I); + assign O = !I; +endmodule + +module LUT1(output O, input I0); + parameter [1:0] INIT = 0; + assign O = I0 ? INIT[1] : INIT[0]; +endmodule + +module LUT2(output O, input I0, I1); + parameter [3:0] INIT = 0; + wire [ 1: 0] s1 = I1 ? INIT[ 3: 2] : INIT[ 1: 0]; + assign O = I0 ? s1[1] : s1[0]; +endmodule + +module LUT3(output O, input I0, I1, I2); + parameter [7:0] INIT = 0; + wire [ 3: 0] s2 = I2 ? INIT[ 7: 4] : INIT[ 3: 0]; + wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0]; + assign O = I0 ? s1[1] : s1[0]; +endmodule + +module LUT4(output O, input I0, I1, I2, I3); + parameter [15:0] INIT = 0; + wire [ 7: 0] s3 = I3 ? INIT[15: 8] : INIT[ 7: 0]; + wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0]; + wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0]; + assign O = I0 ? s1[1] : s1[0]; +endmodule + +module LUT5(output O, input I0, I1, I2, I3, I4); + parameter [31:0] INIT = 0; + wire [15: 0] s4 = I4 ? INIT[31:16] : INIT[15: 0]; + wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0]; + wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0]; + wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0]; + assign O = I0 ? s1[1] : s1[0]; +endmodule + +module LUT6(output O, input I0, I1, I2, I3, I4, I5); + parameter [63:0] INIT = 0; + wire [31: 0] s5 = I5 ? INIT[63:32] : INIT[31: 0]; + wire [15: 0] s4 = I4 ? s5[31:16] : s5[15: 0]; + wire [ 7: 0] s3 = I3 ? s4[15: 8] : s4[ 7: 0]; + wire [ 3: 0] s2 = I2 ? s3[ 7: 4] : s3[ 3: 0]; + wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0]; + assign O = I0 ? s1[1] : s1[0]; +endmodule + +module MUXCY(output O, input CI, DI, S); + assign O = S ? CI : DI; +endmodule + +module MUXF7(output O, input I0, I1, S); + assign O = S ? I1 : I0; +endmodule + +module MUXF8(output O, input I0, I1, S); + assign O = S ? I1 : I0; +endmodule + +module XORCY(output O, input CI, LI); + assign O = CI ^ LI; +endmodule + +module CARRY4(output [3:0] CO, O, input CI, CYINIT, input [3:0] DI, S); + assign O = S ^ {CO[2:0], CI | CYINIT}; + assign CO[0] = S[0] ? CI | CYINIT : DI[0]; + assign CO[1] = S[1] ? CO[0] : DI[1]; + assign CO[2] = S[2] ? CO[1] : DI[2]; + assign CO[3] = S[3] ? CO[2] : DI[3]; +endmodule + +module FDRE (output reg Q, input C, CE, D, R); + parameter [0:0] INIT = 1'b0; + parameter [0:0] IS_C_INVERTED = 1'b0; + parameter [0:0] IS_D_INVERTED = 1'b0; + parameter [0:0] IS_R_INVERTED = 1'b0; + initial Q <= INIT; + generate case (|IS_C_INVERTED) + 1'b0: always @(posedge C) if (R == !IS_R_INVERTED) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED; + 1'b1: always @(negedge C) if (R == !IS_R_INVERTED) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED; + endcase endgenerate +endmodule + +module FDSE (output reg Q, input C, CE, D, S); + parameter [0:0] INIT = 1'b0; + parameter [0:0] IS_C_INVERTED = 1'b0; + parameter [0:0] IS_D_INVERTED = 1'b0; + parameter [0:0] IS_S_INVERTED = 1'b0; + initial Q <= INIT; + generate case (|IS_C_INVERTED) + 1'b0: always @(posedge C) if (S == !IS_S_INVERTED) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED; + 1'b1: always @(negedge C) if (S == !IS_S_INVERTED) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED; + endcase endgenerate +endmodule + +module FDCE (output reg Q, input C, CE, D, CLR); + parameter [0:0] INIT = 1'b0; + parameter [0:0] IS_C_INVERTED = 1'b0; + parameter [0:0] IS_D_INVERTED = 1'b0; + parameter [0:0] IS_CLR_INVERTED = 1'b0; + initial Q <= INIT; + generate case ({|IS_C_INVERTED, |IS_CLR_INVERTED}) + 2'b00: always @(posedge C, posedge CLR) if ( CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED; + 2'b01: always @(posedge C, negedge CLR) if (!CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED; + 2'b10: always @(negedge C, posedge CLR) if ( CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED; + 2'b11: always @(negedge C, negedge CLR) if (!CLR) Q <= 1'b0; else if (CE) Q <= D ^ IS_D_INVERTED; + endcase endgenerate +endmodule + +module FDPE (output reg Q, input C, CE, D, PRE); + parameter [0:0] INIT = 1'b0; + parameter [0:0] IS_C_INVERTED = 1'b0; + parameter [0:0] IS_D_INVERTED = 1'b0; + parameter [0:0] IS_PRE_INVERTED = 1'b0; + initial Q <= INIT; + generate case ({|IS_C_INVERTED, |IS_PRE_INVERTED}) + 2'b00: always @(posedge C, posedge PRE) if ( PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED; + 2'b01: always @(posedge C, negedge PRE) if (!PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED; + 2'b10: always @(negedge C, posedge PRE) if ( PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED; + 2'b11: always @(negedge C, negedge PRE) if (!PRE) Q <= 1'b1; else if (CE) Q <= D ^ IS_D_INVERTED; + endcase endgenerate +endmodule + diff --git a/verilog/windows/autoyosys/share/xilinx/cells_xtra.v b/verilog/windows/autoyosys/share/xilinx/cells_xtra.v new file mode 100644 index 0000000..a2dd01a --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/cells_xtra.v @@ -0,0 +1,3293 @@ +// Created by cells_xtra.sh from Xilinx models + +module BSCANE2 (...); + parameter DISABLE_JTAG = "FALSE"; + parameter integer JTAG_CHAIN = 1; + output CAPTURE; + output DRCK; + output RESET; + output RUNTEST; + output SEL; + output SHIFT; + output TCK; + output TDI; + output TMS; + output UPDATE; + input TDO; +endmodule + +module BUFGCE (...); + parameter CE_TYPE = "SYNC"; + parameter [0:0] IS_CE_INVERTED = 1'b0; + parameter [0:0] IS_I_INVERTED = 1'b0; + output O; + input CE; + input I; +endmodule + +module BUFGCE_1 (...); + output O; + input CE, I; +endmodule + +module BUFGCTRL (...); + output O; + input CE0; + input CE1; + input I0; + input I1; + input IGNORE0; + input IGNORE1; + input S0; + input S1; + parameter integer INIT_OUT = 0; + parameter PRESELECT_I0 = "FALSE"; + parameter PRESELECT_I1 = "FALSE"; + parameter [0:0] IS_CE0_INVERTED = 1'b0; + parameter [0:0] IS_CE1_INVERTED = 1'b0; + parameter [0:0] IS_I0_INVERTED = 1'b0; + parameter [0:0] IS_I1_INVERTED = 1'b0; + parameter [0:0] IS_IGNORE0_INVERTED = 1'b0; + parameter [0:0] IS_IGNORE1_INVERTED = 1'b0; + parameter [0:0] IS_S0_INVERTED = 1'b0; + parameter [0:0] IS_S1_INVERTED = 1'b0; +endmodule + +module BUFGMUX (...); + parameter CLK_SEL_TYPE = "SYNC"; + output O; + input I0, I1, S; +endmodule + +module BUFGMUX_1 (...); + parameter CLK_SEL_TYPE = "SYNC"; + output O; + input I0, I1, S; +endmodule + +module BUFGMUX_CTRL (...); + output O; + input I0; + input I1; + input S; +endmodule + +module BUFH (...); + output O; + input I; +endmodule + +module BUFHCE (...); + parameter CE_TYPE = "SYNC"; + parameter integer INIT_OUT = 0; + parameter [0:0] IS_CE_INVERTED = 1'b0; + output O; + input CE; + input I; +endmodule + +module BUFIO (...); + output O; + input I; +endmodule + +module BUFMR (...); + output O; + input I; +endmodule + +module BUFMRCE (...); + parameter CE_TYPE = "SYNC"; + parameter integer INIT_OUT = 0; + parameter [0:0] IS_CE_INVERTED = 1'b0; + output O; + input CE; + input I; +endmodule + +module BUFR (...); + output O; + input CE; + input CLR; + input I; + parameter BUFR_DIVIDE = "BYPASS"; + parameter SIM_DEVICE = "7SERIES"; +endmodule + +module CAPTUREE2 (...); + parameter ONESHOT = "TRUE"; + input CAP; + input CLK; +endmodule + +module CFGLUT5 (...); + parameter [31:0] INIT = 32'h00000000; + parameter [0:0] IS_CLK_INVERTED = 1'b0; + output CDO; + output O5; + output O6; + input I4, I3, I2, I1, I0; + input CDI, CE, CLK; +endmodule + +module DCIRESET (...); + output LOCKED; + input RST; +endmodule + +module DNA_PORT (...); + parameter [56:0] SIM_DNA_VALUE = 57'h0; + output DOUT; + input CLK, DIN, READ, SHIFT; +endmodule + +module DSP48E1 (...); + parameter integer ACASCREG = 1; + parameter integer ADREG = 1; + parameter integer ALUMODEREG = 1; + parameter integer AREG = 1; + parameter AUTORESET_PATDET = "NO_RESET"; + parameter A_INPUT = "DIRECT"; + parameter integer BCASCREG = 1; + parameter integer BREG = 1; + parameter B_INPUT = "DIRECT"; + parameter integer CARRYINREG = 1; + parameter integer CARRYINSELREG = 1; + parameter integer CREG = 1; + parameter integer DREG = 1; + parameter integer INMODEREG = 1; + parameter integer MREG = 1; + parameter integer OPMODEREG = 1; + parameter integer PREG = 1; + parameter SEL_MASK = "MASK"; + parameter SEL_PATTERN = "PATTERN"; + parameter USE_DPORT = "FALSE"; + parameter USE_MULT = "MULTIPLY"; + parameter USE_PATTERN_DETECT = "NO_PATDET"; + parameter USE_SIMD = "ONE48"; + parameter [47:0] MASK = 48'h3FFFFFFFFFFF; + parameter [47:0] PATTERN = 48'h000000000000; + parameter [3:0] IS_ALUMODE_INVERTED = 4'b0; + parameter [0:0] IS_CARRYIN_INVERTED = 1'b0; + parameter [0:0] IS_CLK_INVERTED = 1'b0; + parameter [4:0] IS_INMODE_INVERTED = 5'b0; + parameter [6:0] IS_OPMODE_INVERTED = 7'b0; + output [29:0] ACOUT; + output [17:0] BCOUT; + output CARRYCASCOUT; + output [3:0] CARRYOUT; + output MULTSIGNOUT; + output OVERFLOW; + output [47:0] P; + output PATTERNBDETECT; + output PATTERNDETECT; + output [47:0] PCOUT; + output UNDERFLOW; + input [29:0] A; + input [29:0] ACIN; + input [3:0] ALUMODE; + input [17:0] B; + input [17:0] BCIN; + input [47:0] C; + input CARRYCASCIN; + input CARRYIN; + input [2:0] CARRYINSEL; + input CEA1; + input CEA2; + input CEAD; + input CEALUMODE; + input CEB1; + input CEB2; + input CEC; + input CECARRYIN; + input CECTRL; + input CED; + input CEINMODE; + input CEM; + input CEP; + input CLK; + input [24:0] D; + input [4:0] INMODE; + input MULTSIGNIN; + input [6:0] OPMODE; + input [47:0] PCIN; + input RSTA; + input RSTALLCARRYIN; + input RSTALUMODE; + input RSTB; + input RSTC; + input RSTCTRL; + input RSTD; + input RSTINMODE; + input RSTM; + input RSTP; +endmodule + +module EFUSE_USR (...); + parameter [31:0] SIM_EFUSE_VALUE = 32'h00000000; + output [31:0] EFUSEUSR; +endmodule + +module FIFO18E1 (...); + parameter ALMOST_EMPTY_OFFSET = 13'h0080; + parameter ALMOST_FULL_OFFSET = 13'h0080; + parameter integer DATA_WIDTH = 4; + parameter integer DO_REG = 1; + parameter EN_SYN = "FALSE"; + parameter FIFO_MODE = "FIFO18"; + parameter FIRST_WORD_FALL_THROUGH = "FALSE"; + parameter INIT = 36'h0; + parameter SIM_DEVICE = "VIRTEX6"; + parameter SRVAL = 36'h0; + parameter IS_RDCLK_INVERTED = 1'b0; + parameter IS_RDEN_INVERTED = 1'b0; + parameter IS_RSTREG_INVERTED = 1'b0; + parameter IS_RST_INVERTED = 1'b0; + parameter IS_WRCLK_INVERTED = 1'b0; + parameter IS_WREN_INVERTED = 1'b0; + output ALMOSTEMPTY; + output ALMOSTFULL; + output [31:0] DO; + output [3:0] DOP; + output EMPTY; + output FULL; + output [11:0] RDCOUNT; + output RDERR; + output [11:0] WRCOUNT; + output WRERR; + input [31:0] DI; + input [3:0] DIP; + input RDCLK; + input RDEN; + input REGCE; + input RST; + input RSTREG; + input WRCLK; + input WREN; +endmodule + +module FIFO36E1 (...); + parameter ALMOST_EMPTY_OFFSET = 13'h0080; + parameter ALMOST_FULL_OFFSET = 13'h0080; + parameter integer DATA_WIDTH = 4; + parameter integer DO_REG = 1; + parameter EN_ECC_READ = "FALSE"; + parameter EN_ECC_WRITE = "FALSE"; + parameter EN_SYN = "FALSE"; + parameter FIFO_MODE = "FIFO36"; + parameter FIRST_WORD_FALL_THROUGH = "FALSE"; + parameter INIT = 72'h0; + parameter SIM_DEVICE = "VIRTEX6"; + parameter SRVAL = 72'h0; + parameter IS_RDCLK_INVERTED = 1'b0; + parameter IS_RDEN_INVERTED = 1'b0; + parameter IS_RSTREG_INVERTED = 1'b0; + parameter IS_RST_INVERTED = 1'b0; + parameter IS_WRCLK_INVERTED = 1'b0; + parameter IS_WREN_INVERTED = 1'b0; + output ALMOSTEMPTY; + output ALMOSTFULL; + output DBITERR; + output [63:0] DO; + output [7:0] DOP; + output [7:0] ECCPARITY; + output EMPTY; + output FULL; + output [12:0] RDCOUNT; + output RDERR; + output SBITERR; + output [12:0] WRCOUNT; + output WRERR; + input [63:0] DI; + input [7:0] DIP; + input INJECTDBITERR; + input INJECTSBITERR; + input RDCLK; + input RDEN; + input REGCE; + input RST; + input RSTREG; + input WRCLK; + input WREN; +endmodule + +module FRAME_ECCE2 (...); + parameter FARSRC = "EFAR"; + parameter FRAME_RBT_IN_FILENAME = "NONE"; + output CRCERROR; + output ECCERROR; + output ECCERRORSINGLE; + output SYNDROMEVALID; + output [12:0] SYNDROME; + output [25:0] FAR; + output [4:0] SYNBIT; + output [6:0] SYNWORD; +endmodule + +module GTHE2_CHANNEL (...); + parameter [0:0] ACJTAG_DEBUG_MODE = 1'b0; + parameter [0:0] ACJTAG_MODE = 1'b0; + parameter [0:0] ACJTAG_RESET = 1'b0; + parameter [19:0] ADAPT_CFG0 = 20'h00C10; + parameter ALIGN_COMMA_DOUBLE = "FALSE"; + parameter [9:0] ALIGN_COMMA_ENABLE = 10'b0001111111; + parameter integer ALIGN_COMMA_WORD = 1; + parameter ALIGN_MCOMMA_DET = "TRUE"; + parameter [9:0] ALIGN_MCOMMA_VALUE = 10'b1010000011; + parameter ALIGN_PCOMMA_DET = "TRUE"; + parameter [9:0] ALIGN_PCOMMA_VALUE = 10'b0101111100; + parameter [0:0] A_RXOSCALRESET = 1'b0; + parameter CBCC_DATA_SOURCE_SEL = "DECODED"; + parameter [41:0] CFOK_CFG = 42'h24800040E80; + parameter [5:0] CFOK_CFG2 = 6'b100000; + parameter [5:0] CFOK_CFG3 = 6'b100000; + parameter CHAN_BOND_KEEP_ALIGN = "FALSE"; + parameter integer CHAN_BOND_MAX_SKEW = 7; + parameter [9:0] CHAN_BOND_SEQ_1_1 = 10'b0101111100; + parameter [9:0] CHAN_BOND_SEQ_1_2 = 10'b0000000000; + parameter [9:0] CHAN_BOND_SEQ_1_3 = 10'b0000000000; + parameter [9:0] CHAN_BOND_SEQ_1_4 = 10'b0000000000; + parameter [3:0] CHAN_BOND_SEQ_1_ENABLE = 4'b1111; + parameter [9:0] CHAN_BOND_SEQ_2_1 = 10'b0100000000; + parameter [9:0] CHAN_BOND_SEQ_2_2 = 10'b0100000000; + parameter [9:0] CHAN_BOND_SEQ_2_3 = 10'b0100000000; + parameter [9:0] CHAN_BOND_SEQ_2_4 = 10'b0100000000; + parameter [3:0] CHAN_BOND_SEQ_2_ENABLE = 4'b1111; + parameter CHAN_BOND_SEQ_2_USE = "FALSE"; + parameter integer CHAN_BOND_SEQ_LEN = 1; + parameter CLK_CORRECT_USE = "TRUE"; + parameter CLK_COR_KEEP_IDLE = "FALSE"; + parameter integer CLK_COR_MAX_LAT = 20; + parameter integer CLK_COR_MIN_LAT = 18; + parameter CLK_COR_PRECEDENCE = "TRUE"; + parameter integer CLK_COR_REPEAT_WAIT = 0; + parameter [9:0] CLK_COR_SEQ_1_1 = 10'b0100011100; + parameter [9:0] CLK_COR_SEQ_1_2 = 10'b0000000000; + parameter [9:0] CLK_COR_SEQ_1_3 = 10'b0000000000; + parameter [9:0] CLK_COR_SEQ_1_4 = 10'b0000000000; + parameter [3:0] CLK_COR_SEQ_1_ENABLE = 4'b1111; + parameter [9:0] CLK_COR_SEQ_2_1 = 10'b0100000000; + parameter [9:0] CLK_COR_SEQ_2_2 = 10'b0100000000; + parameter [9:0] CLK_COR_SEQ_2_3 = 10'b0100000000; + parameter [9:0] CLK_COR_SEQ_2_4 = 10'b0100000000; + parameter [3:0] CLK_COR_SEQ_2_ENABLE = 4'b1111; + parameter CLK_COR_SEQ_2_USE = "FALSE"; + parameter integer CLK_COR_SEQ_LEN = 1; + parameter [28:0] CPLL_CFG = 29'h00BC07DC; + parameter integer CPLL_FBDIV = 4; + parameter integer CPLL_FBDIV_45 = 5; + parameter [23:0] CPLL_INIT_CFG = 24'h00001E; + parameter [15:0] CPLL_LOCK_CFG = 16'h01E8; + parameter integer CPLL_REFCLK_DIV = 1; + parameter DEC_MCOMMA_DETECT = "TRUE"; + parameter DEC_PCOMMA_DETECT = "TRUE"; + parameter DEC_VALID_COMMA_ONLY = "TRUE"; + parameter [23:0] DMONITOR_CFG = 24'h000A00; + parameter [0:0] ES_CLK_PHASE_SEL = 1'b0; + parameter [5:0] ES_CONTROL = 6'b000000; + parameter ES_ERRDET_EN = "FALSE"; + parameter ES_EYE_SCAN_EN = "TRUE"; + parameter [11:0] ES_HORZ_OFFSET = 12'h000; + parameter [9:0] ES_PMA_CFG = 10'b0000000000; + parameter [4:0] ES_PRESCALE = 5'b00000; + parameter [79:0] ES_QUALIFIER = 80'h00000000000000000000; + parameter [79:0] ES_QUAL_MASK = 80'h00000000000000000000; + parameter [79:0] ES_SDATA_MASK = 80'h00000000000000000000; + parameter [8:0] ES_VERT_OFFSET = 9'b000000000; + parameter [3:0] FTS_DESKEW_SEQ_ENABLE = 4'b1111; + parameter [3:0] FTS_LANE_DESKEW_CFG = 4'b1111; + parameter FTS_LANE_DESKEW_EN = "FALSE"; + parameter [2:0] GEARBOX_MODE = 3'b000; + parameter [0:0] IS_CLKRSVD0_INVERTED = 1'b0; + parameter [0:0] IS_CLKRSVD1_INVERTED = 1'b0; + parameter [0:0] IS_CPLLLOCKDETCLK_INVERTED = 1'b0; + parameter [0:0] IS_DMONITORCLK_INVERTED = 1'b0; + parameter [0:0] IS_DRPCLK_INVERTED = 1'b0; + parameter [0:0] IS_GTGREFCLK_INVERTED = 1'b0; + parameter [0:0] IS_RXUSRCLK2_INVERTED = 1'b0; + parameter [0:0] IS_RXUSRCLK_INVERTED = 1'b0; + parameter [0:0] IS_SIGVALIDCLK_INVERTED = 1'b0; + parameter [0:0] IS_TXPHDLYTSTCLK_INVERTED = 1'b0; + parameter [0:0] IS_TXUSRCLK2_INVERTED = 1'b0; + parameter [0:0] IS_TXUSRCLK_INVERTED = 1'b0; + parameter [0:0] LOOPBACK_CFG = 1'b0; + parameter [1:0] OUTREFCLK_SEL_INV = 2'b11; + parameter PCS_PCIE_EN = "FALSE"; + parameter [47:0] PCS_RSVD_ATTR = 48'h000000000000; + parameter [11:0] PD_TRANS_TIME_FROM_P2 = 12'h03C; + parameter [7:0] PD_TRANS_TIME_NONE_P2 = 8'h19; + parameter [7:0] PD_TRANS_TIME_TO_P2 = 8'h64; + parameter [31:0] PMA_RSV = 32'b00000000000000000000000010000000; + parameter [31:0] PMA_RSV2 = 32'b00011100000000000000000000001010; + parameter [1:0] PMA_RSV3 = 2'b00; + parameter [14:0] PMA_RSV4 = 15'b000000000001000; + parameter [3:0] PMA_RSV5 = 4'b0000; + parameter [0:0] RESET_POWERSAVE_DISABLE = 1'b0; + parameter [4:0] RXBUFRESET_TIME = 5'b00001; + parameter RXBUF_ADDR_MODE = "FULL"; + parameter [3:0] RXBUF_EIDLE_HI_CNT = 4'b1000; + parameter [3:0] RXBUF_EIDLE_LO_CNT = 4'b0000; + parameter RXBUF_EN = "TRUE"; + parameter RXBUF_RESET_ON_CB_CHANGE = "TRUE"; + parameter RXBUF_RESET_ON_COMMAALIGN = "FALSE"; + parameter RXBUF_RESET_ON_EIDLE = "FALSE"; + parameter RXBUF_RESET_ON_RATE_CHANGE = "TRUE"; + parameter integer RXBUF_THRESH_OVFLW = 61; + parameter RXBUF_THRESH_OVRD = "FALSE"; + parameter integer RXBUF_THRESH_UNDFLW = 4; + parameter [4:0] RXCDRFREQRESET_TIME = 5'b00001; + parameter [4:0] RXCDRPHRESET_TIME = 5'b00001; + parameter [82:0] RXCDR_CFG = 83'h0002007FE2000C208001A; + parameter [0:0] RXCDR_FR_RESET_ON_EIDLE = 1'b0; + parameter [0:0] RXCDR_HOLD_DURING_EIDLE = 1'b0; + parameter [5:0] RXCDR_LOCK_CFG = 6'b001001; + parameter [0:0] RXCDR_PH_RESET_ON_EIDLE = 1'b0; + parameter [6:0] RXDFELPMRESET_TIME = 7'b0001111; + parameter [15:0] RXDLY_CFG = 16'h001F; + parameter [8:0] RXDLY_LCFG = 9'h030; + parameter [15:0] RXDLY_TAP_CFG = 16'h0000; + parameter RXGEARBOX_EN = "FALSE"; + parameter [4:0] RXISCANRESET_TIME = 5'b00001; + parameter [13:0] RXLPM_HF_CFG = 14'b00001000000000; + parameter [17:0] RXLPM_LF_CFG = 18'b001001000000000000; + parameter [6:0] RXOOB_CFG = 7'b0000110; + parameter RXOOB_CLK_CFG = "PMA"; + parameter [4:0] RXOSCALRESET_TIME = 5'b00011; + parameter [4:0] RXOSCALRESET_TIMEOUT = 5'b00000; + parameter integer RXOUT_DIV = 2; + parameter [4:0] RXPCSRESET_TIME = 5'b00001; + parameter [23:0] RXPHDLY_CFG = 24'h084020; + parameter [23:0] RXPH_CFG = 24'hC00002; + parameter [4:0] RXPH_MONITOR_SEL = 5'b00000; + parameter [1:0] RXPI_CFG0 = 2'b00; + parameter [1:0] RXPI_CFG1 = 2'b00; + parameter [1:0] RXPI_CFG2 = 2'b00; + parameter [1:0] RXPI_CFG3 = 2'b00; + parameter [0:0] RXPI_CFG4 = 1'b0; + parameter [0:0] RXPI_CFG5 = 1'b0; + parameter [2:0] RXPI_CFG6 = 3'b100; + parameter [4:0] RXPMARESET_TIME = 5'b00011; + parameter [0:0] RXPRBS_ERR_LOOPBACK = 1'b0; + parameter integer RXSLIDE_AUTO_WAIT = 7; + parameter RXSLIDE_MODE = "OFF"; + parameter [0:0] RXSYNC_MULTILANE = 1'b0; + parameter [0:0] RXSYNC_OVRD = 1'b0; + parameter [0:0] RXSYNC_SKIP_DA = 1'b0; + parameter [23:0] RX_BIAS_CFG = 24'b000011000000000000010000; + parameter [5:0] RX_BUFFER_CFG = 6'b000000; + parameter integer RX_CLK25_DIV = 7; + parameter [0:0] RX_CLKMUX_PD = 1'b1; + parameter [1:0] RX_CM_SEL = 2'b11; + parameter [3:0] RX_CM_TRIM = 4'b0100; + parameter integer RX_DATA_WIDTH = 20; + parameter [5:0] RX_DDI_SEL = 6'b000000; + parameter [13:0] RX_DEBUG_CFG = 14'b00000000000000; + parameter RX_DEFER_RESET_BUF_EN = "TRUE"; + parameter [3:0] RX_DFELPM_CFG0 = 4'b0110; + parameter [0:0] RX_DFELPM_CFG1 = 1'b0; + parameter [0:0] RX_DFELPM_KLKH_AGC_STUP_EN = 1'b1; + parameter [1:0] RX_DFE_AGC_CFG0 = 2'b00; + parameter [2:0] RX_DFE_AGC_CFG1 = 3'b010; + parameter [3:0] RX_DFE_AGC_CFG2 = 4'b0000; + parameter [0:0] RX_DFE_AGC_OVRDEN = 1'b1; + parameter [22:0] RX_DFE_GAIN_CFG = 23'h0020C0; + parameter [11:0] RX_DFE_H2_CFG = 12'b000000000000; + parameter [11:0] RX_DFE_H3_CFG = 12'b000001000000; + parameter [10:0] RX_DFE_H4_CFG = 11'b00011100000; + parameter [10:0] RX_DFE_H5_CFG = 11'b00011100000; + parameter [10:0] RX_DFE_H6_CFG = 11'b00000100000; + parameter [10:0] RX_DFE_H7_CFG = 11'b00000100000; + parameter [32:0] RX_DFE_KL_CFG = 33'b000000000000000000000001100010000; + parameter [1:0] RX_DFE_KL_LPM_KH_CFG0 = 2'b01; + parameter [2:0] RX_DFE_KL_LPM_KH_CFG1 = 3'b010; + parameter [3:0] RX_DFE_KL_LPM_KH_CFG2 = 4'b0010; + parameter [0:0] RX_DFE_KL_LPM_KH_OVRDEN = 1'b1; + parameter [1:0] RX_DFE_KL_LPM_KL_CFG0 = 2'b10; + parameter [2:0] RX_DFE_KL_LPM_KL_CFG1 = 3'b010; + parameter [3:0] RX_DFE_KL_LPM_KL_CFG2 = 4'b0010; + parameter [0:0] RX_DFE_KL_LPM_KL_OVRDEN = 1'b1; + parameter [15:0] RX_DFE_LPM_CFG = 16'h0080; + parameter [0:0] RX_DFE_LPM_HOLD_DURING_EIDLE = 1'b0; + parameter [53:0] RX_DFE_ST_CFG = 54'h00E100000C003F; + parameter [16:0] RX_DFE_UT_CFG = 17'b00011100000000000; + parameter [16:0] RX_DFE_VP_CFG = 17'b00011101010100011; + parameter RX_DISPERR_SEQ_MATCH = "TRUE"; + parameter integer RX_INT_DATAWIDTH = 0; + parameter [12:0] RX_OS_CFG = 13'b0000010000000; + parameter integer RX_SIG_VALID_DLY = 10; + parameter RX_XCLK_SEL = "RXREC"; + parameter integer SAS_MAX_COM = 64; + parameter integer SAS_MIN_COM = 36; + parameter [3:0] SATA_BURST_SEQ_LEN = 4'b1111; + parameter [2:0] SATA_BURST_VAL = 3'b100; + parameter SATA_CPLL_CFG = "VCO_3000MHZ"; + parameter [2:0] SATA_EIDLE_VAL = 3'b100; + parameter integer SATA_MAX_BURST = 8; + parameter integer SATA_MAX_INIT = 21; + parameter integer SATA_MAX_WAKE = 7; + parameter integer SATA_MIN_BURST = 4; + parameter integer SATA_MIN_INIT = 12; + parameter integer SATA_MIN_WAKE = 4; + parameter SHOW_REALIGN_COMMA = "TRUE"; + parameter [2:0] SIM_CPLLREFCLK_SEL = 3'b001; + parameter SIM_RECEIVER_DETECT_PASS = "TRUE"; + parameter SIM_RESET_SPEEDUP = "TRUE"; + parameter SIM_TX_EIDLE_DRIVE_LEVEL = "X"; + parameter SIM_VERSION = "1.1"; + parameter [14:0] TERM_RCAL_CFG = 15'b100001000010000; + parameter [2:0] TERM_RCAL_OVRD = 3'b000; + parameter [7:0] TRANS_TIME_RATE = 8'h0E; + parameter [31:0] TST_RSV = 32'h00000000; + parameter TXBUF_EN = "TRUE"; + parameter TXBUF_RESET_ON_RATE_CHANGE = "FALSE"; + parameter [15:0] TXDLY_CFG = 16'h001F; + parameter [8:0] TXDLY_LCFG = 9'h030; + parameter [15:0] TXDLY_TAP_CFG = 16'h0000; + parameter TXGEARBOX_EN = "FALSE"; + parameter [0:0] TXOOB_CFG = 1'b0; + parameter integer TXOUT_DIV = 2; + parameter [4:0] TXPCSRESET_TIME = 5'b00001; + parameter [23:0] TXPHDLY_CFG = 24'h084020; + parameter [15:0] TXPH_CFG = 16'h0780; + parameter [4:0] TXPH_MONITOR_SEL = 5'b00000; + parameter [1:0] TXPI_CFG0 = 2'b00; + parameter [1:0] TXPI_CFG1 = 2'b00; + parameter [1:0] TXPI_CFG2 = 2'b00; + parameter [0:0] TXPI_CFG3 = 1'b0; + parameter [0:0] TXPI_CFG4 = 1'b0; + parameter [2:0] TXPI_CFG5 = 3'b100; + parameter [0:0] TXPI_GREY_SEL = 1'b0; + parameter [0:0] TXPI_INVSTROBE_SEL = 1'b0; + parameter TXPI_PPMCLK_SEL = "TXUSRCLK2"; + parameter [7:0] TXPI_PPM_CFG = 8'b00000000; + parameter [2:0] TXPI_SYNFREQ_PPM = 3'b000; + parameter [4:0] TXPMARESET_TIME = 5'b00001; + parameter [0:0] TXSYNC_MULTILANE = 1'b0; + parameter [0:0] TXSYNC_OVRD = 1'b0; + parameter [0:0] TXSYNC_SKIP_DA = 1'b0; + parameter integer TX_CLK25_DIV = 7; + parameter [0:0] TX_CLKMUX_PD = 1'b1; + parameter integer TX_DATA_WIDTH = 20; + parameter [5:0] TX_DEEMPH0 = 6'b000000; + parameter [5:0] TX_DEEMPH1 = 6'b000000; + parameter TX_DRIVE_MODE = "DIRECT"; + parameter [2:0] TX_EIDLE_ASSERT_DELAY = 3'b110; + parameter [2:0] TX_EIDLE_DEASSERT_DELAY = 3'b100; + parameter integer TX_INT_DATAWIDTH = 0; + parameter TX_LOOPBACK_DRIVE_HIZ = "FALSE"; + parameter [0:0] TX_MAINCURSOR_SEL = 1'b0; + parameter [6:0] TX_MARGIN_FULL_0 = 7'b1001110; + parameter [6:0] TX_MARGIN_FULL_1 = 7'b1001001; + parameter [6:0] TX_MARGIN_FULL_2 = 7'b1000101; + parameter [6:0] TX_MARGIN_FULL_3 = 7'b1000010; + parameter [6:0] TX_MARGIN_FULL_4 = 7'b1000000; + parameter [6:0] TX_MARGIN_LOW_0 = 7'b1000110; + parameter [6:0] TX_MARGIN_LOW_1 = 7'b1000100; + parameter [6:0] TX_MARGIN_LOW_2 = 7'b1000010; + parameter [6:0] TX_MARGIN_LOW_3 = 7'b1000000; + parameter [6:0] TX_MARGIN_LOW_4 = 7'b1000000; + parameter [0:0] TX_QPI_STATUS_EN = 1'b0; + parameter [13:0] TX_RXDETECT_CFG = 14'h1832; + parameter [16:0] TX_RXDETECT_PRECHARGE_TIME = 17'h00000; + parameter [2:0] TX_RXDETECT_REF = 3'b100; + parameter TX_XCLK_SEL = "TXUSR"; + parameter [0:0] UCODEER_CLR = 1'b0; + parameter [0:0] USE_PCS_CLK_PHASE_SEL = 1'b0; + output CPLLFBCLKLOST; + output CPLLLOCK; + output CPLLREFCLKLOST; + output DRPRDY; + output EYESCANDATAERROR; + output GTHTXN; + output GTHTXP; + output GTREFCLKMONITOR; + output PHYSTATUS; + output RSOSINTDONE; + output RXBYTEISALIGNED; + output RXBYTEREALIGN; + output RXCDRLOCK; + output RXCHANBONDSEQ; + output RXCHANISALIGNED; + output RXCHANREALIGN; + output RXCOMINITDET; + output RXCOMMADET; + output RXCOMSASDET; + output RXCOMWAKEDET; + output RXDFESLIDETAPSTARTED; + output RXDFESLIDETAPSTROBEDONE; + output RXDFESLIDETAPSTROBESTARTED; + output RXDFESTADAPTDONE; + output RXDLYSRESETDONE; + output RXELECIDLE; + output RXOSINTSTARTED; + output RXOSINTSTROBEDONE; + output RXOSINTSTROBESTARTED; + output RXOUTCLK; + output RXOUTCLKFABRIC; + output RXOUTCLKPCS; + output RXPHALIGNDONE; + output RXPMARESETDONE; + output RXPRBSERR; + output RXQPISENN; + output RXQPISENP; + output RXRATEDONE; + output RXRESETDONE; + output RXSYNCDONE; + output RXSYNCOUT; + output RXVALID; + output TXCOMFINISH; + output TXDLYSRESETDONE; + output TXGEARBOXREADY; + output TXOUTCLK; + output TXOUTCLKFABRIC; + output TXOUTCLKPCS; + output TXPHALIGNDONE; + output TXPHINITDONE; + output TXPMARESETDONE; + output TXQPISENN; + output TXQPISENP; + output TXRATEDONE; + output TXRESETDONE; + output TXSYNCDONE; + output TXSYNCOUT; + output [14:0] DMONITOROUT; + output [15:0] DRPDO; + output [15:0] PCSRSVDOUT; + output [1:0] RXCLKCORCNT; + output [1:0] RXDATAVALID; + output [1:0] RXHEADERVALID; + output [1:0] RXSTARTOFSEQ; + output [1:0] TXBUFSTATUS; + output [2:0] RXBUFSTATUS; + output [2:0] RXSTATUS; + output [4:0] RXCHBONDO; + output [4:0] RXPHMONITOR; + output [4:0] RXPHSLIPMONITOR; + output [5:0] RXHEADER; + output [63:0] RXDATA; + output [6:0] RXMONITOROUT; + output [7:0] RXCHARISCOMMA; + output [7:0] RXCHARISK; + output [7:0] RXDISPERR; + output [7:0] RXNOTINTABLE; + input CFGRESET; + input CLKRSVD0; + input CLKRSVD1; + input CPLLLOCKDETCLK; + input CPLLLOCKEN; + input CPLLPD; + input CPLLRESET; + input DMONFIFORESET; + input DMONITORCLK; + input DRPCLK; + input DRPEN; + input DRPWE; + input EYESCANMODE; + input EYESCANRESET; + input EYESCANTRIGGER; + input GTGREFCLK; + input GTHRXN; + input GTHRXP; + input GTNORTHREFCLK0; + input GTNORTHREFCLK1; + input GTREFCLK0; + input GTREFCLK1; + input GTRESETSEL; + input GTRXRESET; + input GTSOUTHREFCLK0; + input GTSOUTHREFCLK1; + input GTTXRESET; + input QPLLCLK; + input QPLLREFCLK; + input RESETOVRD; + input RX8B10BEN; + input RXBUFRESET; + input RXCDRFREQRESET; + input RXCDRHOLD; + input RXCDROVRDEN; + input RXCDRRESET; + input RXCDRRESETRSV; + input RXCHBONDEN; + input RXCHBONDMASTER; + input RXCHBONDSLAVE; + input RXCOMMADETEN; + input RXDDIEN; + input RXDFEAGCHOLD; + input RXDFEAGCOVRDEN; + input RXDFECM1EN; + input RXDFELFHOLD; + input RXDFELFOVRDEN; + input RXDFELPMRESET; + input RXDFESLIDETAPADAPTEN; + input RXDFESLIDETAPHOLD; + input RXDFESLIDETAPINITOVRDEN; + input RXDFESLIDETAPONLYADAPTEN; + input RXDFESLIDETAPOVRDEN; + input RXDFESLIDETAPSTROBE; + input RXDFETAP2HOLD; + input RXDFETAP2OVRDEN; + input RXDFETAP3HOLD; + input RXDFETAP3OVRDEN; + input RXDFETAP4HOLD; + input RXDFETAP4OVRDEN; + input RXDFETAP5HOLD; + input RXDFETAP5OVRDEN; + input RXDFETAP6HOLD; + input RXDFETAP6OVRDEN; + input RXDFETAP7HOLD; + input RXDFETAP7OVRDEN; + input RXDFEUTHOLD; + input RXDFEUTOVRDEN; + input RXDFEVPHOLD; + input RXDFEVPOVRDEN; + input RXDFEVSEN; + input RXDFEXYDEN; + input RXDLYBYPASS; + input RXDLYEN; + input RXDLYOVRDEN; + input RXDLYSRESET; + input RXGEARBOXSLIP; + input RXLPMEN; + input RXLPMHFHOLD; + input RXLPMHFOVRDEN; + input RXLPMLFHOLD; + input RXLPMLFKLOVRDEN; + input RXMCOMMAALIGNEN; + input RXOOBRESET; + input RXOSCALRESET; + input RXOSHOLD; + input RXOSINTEN; + input RXOSINTHOLD; + input RXOSINTNTRLEN; + input RXOSINTOVRDEN; + input RXOSINTSTROBE; + input RXOSINTTESTOVRDEN; + input RXOSOVRDEN; + input RXPCOMMAALIGNEN; + input RXPCSRESET; + input RXPHALIGN; + input RXPHALIGNEN; + input RXPHDLYPD; + input RXPHDLYRESET; + input RXPHOVRDEN; + input RXPMARESET; + input RXPOLARITY; + input RXPRBSCNTRESET; + input RXQPIEN; + input RXRATEMODE; + input RXSLIDE; + input RXSYNCALLIN; + input RXSYNCIN; + input RXSYNCMODE; + input RXUSERRDY; + input RXUSRCLK2; + input RXUSRCLK; + input SETERRSTATUS; + input SIGVALIDCLK; + input TX8B10BEN; + input TXCOMINIT; + input TXCOMSAS; + input TXCOMWAKE; + input TXDEEMPH; + input TXDETECTRX; + input TXDIFFPD; + input TXDLYBYPASS; + input TXDLYEN; + input TXDLYHOLD; + input TXDLYOVRDEN; + input TXDLYSRESET; + input TXDLYUPDOWN; + input TXELECIDLE; + input TXINHIBIT; + input TXPCSRESET; + input TXPDELECIDLEMODE; + input TXPHALIGN; + input TXPHALIGNEN; + input TXPHDLYPD; + input TXPHDLYRESET; + input TXPHDLYTSTCLK; + input TXPHINIT; + input TXPHOVRDEN; + input TXPIPPMEN; + input TXPIPPMOVRDEN; + input TXPIPPMPD; + input TXPIPPMSEL; + input TXPISOPD; + input TXPMARESET; + input TXPOLARITY; + input TXPOSTCURSORINV; + input TXPRBSFORCEERR; + input TXPRECURSORINV; + input TXQPIBIASEN; + input TXQPISTRONGPDOWN; + input TXQPIWEAKPUP; + input TXRATEMODE; + input TXSTARTSEQ; + input TXSWING; + input TXSYNCALLIN; + input TXSYNCIN; + input TXSYNCMODE; + input TXUSERRDY; + input TXUSRCLK2; + input TXUSRCLK; + input [13:0] RXADAPTSELTEST; + input [15:0] DRPDI; + input [15:0] GTRSVD; + input [15:0] PCSRSVDIN; + input [19:0] TSTIN; + input [1:0] RXELECIDLEMODE; + input [1:0] RXMONITORSEL; + input [1:0] RXPD; + input [1:0] RXSYSCLKSEL; + input [1:0] TXPD; + input [1:0] TXSYSCLKSEL; + input [2:0] CPLLREFCLKSEL; + input [2:0] LOOPBACK; + input [2:0] RXCHBONDLEVEL; + input [2:0] RXOUTCLKSEL; + input [2:0] RXPRBSSEL; + input [2:0] RXRATE; + input [2:0] TXBUFDIFFCTRL; + input [2:0] TXHEADER; + input [2:0] TXMARGIN; + input [2:0] TXOUTCLKSEL; + input [2:0] TXPRBSSEL; + input [2:0] TXRATE; + input [3:0] RXOSINTCFG; + input [3:0] RXOSINTID0; + input [3:0] TXDIFFCTRL; + input [4:0] PCSRSVDIN2; + input [4:0] PMARSVDIN; + input [4:0] RXCHBONDI; + input [4:0] RXDFEAGCTRL; + input [4:0] RXDFESLIDETAP; + input [4:0] TXPIPPMSTEPSIZE; + input [4:0] TXPOSTCURSOR; + input [4:0] TXPRECURSOR; + input [5:0] RXDFESLIDETAPID; + input [63:0] TXDATA; + input [6:0] TXMAINCURSOR; + input [6:0] TXSEQUENCE; + input [7:0] TX8B10BBYPASS; + input [7:0] TXCHARDISPMODE; + input [7:0] TXCHARDISPVAL; + input [7:0] TXCHARISK; + input [8:0] DRPADDR; +endmodule + +module GTHE2_COMMON (...); + parameter [63:0] BIAS_CFG = 64'h0000040000001000; + parameter [31:0] COMMON_CFG = 32'h0000001C; + parameter [0:0] IS_DRPCLK_INVERTED = 1'b0; + parameter [0:0] IS_GTGREFCLK_INVERTED = 1'b0; + parameter [0:0] IS_QPLLLOCKDETCLK_INVERTED = 1'b0; + parameter [26:0] QPLL_CFG = 27'h0480181; + parameter [3:0] QPLL_CLKOUT_CFG = 4'b0000; + parameter [5:0] QPLL_COARSE_FREQ_OVRD = 6'b010000; + parameter [0:0] QPLL_COARSE_FREQ_OVRD_EN = 1'b0; + parameter [9:0] QPLL_CP = 10'b0000011111; + parameter [0:0] QPLL_CP_MONITOR_EN = 1'b0; + parameter [0:0] QPLL_DMONITOR_SEL = 1'b0; + parameter [9:0] QPLL_FBDIV = 10'b0000000000; + parameter [0:0] QPLL_FBDIV_MONITOR_EN = 1'b0; + parameter [0:0] QPLL_FBDIV_RATIO = 1'b0; + parameter [23:0] QPLL_INIT_CFG = 24'h000006; + parameter [15:0] QPLL_LOCK_CFG = 16'h01E8; + parameter [3:0] QPLL_LPF = 4'b1111; + parameter integer QPLL_REFCLK_DIV = 2; + parameter [0:0] QPLL_RP_COMP = 1'b0; + parameter [1:0] QPLL_VTRL_RESET = 2'b00; + parameter [1:0] RCAL_CFG = 2'b00; + parameter [15:0] RSVD_ATTR0 = 16'h0000; + parameter [15:0] RSVD_ATTR1 = 16'h0000; + parameter [2:0] SIM_QPLLREFCLK_SEL = 3'b001; + parameter SIM_RESET_SPEEDUP = "TRUE"; + parameter SIM_VERSION = "1.1"; + output DRPRDY; + output QPLLFBCLKLOST; + output QPLLLOCK; + output QPLLOUTCLK; + output QPLLOUTREFCLK; + output QPLLREFCLKLOST; + output REFCLKOUTMONITOR; + output [15:0] DRPDO; + output [15:0] PMARSVDOUT; + output [7:0] QPLLDMONITOR; + input BGBYPASSB; + input BGMONITORENB; + input BGPDB; + input BGRCALOVRDENB; + input DRPCLK; + input DRPEN; + input DRPWE; + input GTGREFCLK; + input GTNORTHREFCLK0; + input GTNORTHREFCLK1; + input GTREFCLK0; + input GTREFCLK1; + input GTSOUTHREFCLK0; + input GTSOUTHREFCLK1; + input QPLLLOCKDETCLK; + input QPLLLOCKEN; + input QPLLOUTRESET; + input QPLLPD; + input QPLLRESET; + input RCALENB; + input [15:0] DRPDI; + input [15:0] QPLLRSVD1; + input [2:0] QPLLREFCLKSEL; + input [4:0] BGRCALOVRD; + input [4:0] QPLLRSVD2; + input [7:0] DRPADDR; + input [7:0] PMARSVD; +endmodule + +module GTPE2_CHANNEL (...); + parameter [0:0] ACJTAG_DEBUG_MODE = 1'b0; + parameter [0:0] ACJTAG_MODE = 1'b0; + parameter [0:0] ACJTAG_RESET = 1'b0; + parameter [19:0] ADAPT_CFG0 = 20'b00000000000000000000; + parameter ALIGN_COMMA_DOUBLE = "FALSE"; + parameter [9:0] ALIGN_COMMA_ENABLE = 10'b0001111111; + parameter integer ALIGN_COMMA_WORD = 1; + parameter ALIGN_MCOMMA_DET = "TRUE"; + parameter [9:0] ALIGN_MCOMMA_VALUE = 10'b1010000011; + parameter ALIGN_PCOMMA_DET = "TRUE"; + parameter [9:0] ALIGN_PCOMMA_VALUE = 10'b0101111100; + parameter CBCC_DATA_SOURCE_SEL = "DECODED"; + parameter [42:0] CFOK_CFG = 43'b1001001000000000000000001000000111010000000; + parameter [6:0] CFOK_CFG2 = 7'b0100000; + parameter [6:0] CFOK_CFG3 = 7'b0100000; + parameter [0:0] CFOK_CFG4 = 1'b0; + parameter [1:0] CFOK_CFG5 = 2'b00; + parameter [3:0] CFOK_CFG6 = 4'b0000; + parameter CHAN_BOND_KEEP_ALIGN = "FALSE"; + parameter integer CHAN_BOND_MAX_SKEW = 7; + parameter [9:0] CHAN_BOND_SEQ_1_1 = 10'b0101111100; + parameter [9:0] CHAN_BOND_SEQ_1_2 = 10'b0000000000; + parameter [9:0] CHAN_BOND_SEQ_1_3 = 10'b0000000000; + parameter [9:0] CHAN_BOND_SEQ_1_4 = 10'b0000000000; + parameter [3:0] CHAN_BOND_SEQ_1_ENABLE = 4'b1111; + parameter [9:0] CHAN_BOND_SEQ_2_1 = 10'b0100000000; + parameter [9:0] CHAN_BOND_SEQ_2_2 = 10'b0100000000; + parameter [9:0] CHAN_BOND_SEQ_2_3 = 10'b0100000000; + parameter [9:0] CHAN_BOND_SEQ_2_4 = 10'b0100000000; + parameter [3:0] CHAN_BOND_SEQ_2_ENABLE = 4'b1111; + parameter CHAN_BOND_SEQ_2_USE = "FALSE"; + parameter integer CHAN_BOND_SEQ_LEN = 1; + parameter [0:0] CLK_COMMON_SWING = 1'b0; + parameter CLK_CORRECT_USE = "TRUE"; + parameter CLK_COR_KEEP_IDLE = "FALSE"; + parameter integer CLK_COR_MAX_LAT = 20; + parameter integer CLK_COR_MIN_LAT = 18; + parameter CLK_COR_PRECEDENCE = "TRUE"; + parameter integer CLK_COR_REPEAT_WAIT = 0; + parameter [9:0] CLK_COR_SEQ_1_1 = 10'b0100011100; + parameter [9:0] CLK_COR_SEQ_1_2 = 10'b0000000000; + parameter [9:0] CLK_COR_SEQ_1_3 = 10'b0000000000; + parameter [9:0] CLK_COR_SEQ_1_4 = 10'b0000000000; + parameter [3:0] CLK_COR_SEQ_1_ENABLE = 4'b1111; + parameter [9:0] CLK_COR_SEQ_2_1 = 10'b0100000000; + parameter [9:0] CLK_COR_SEQ_2_2 = 10'b0100000000; + parameter [9:0] CLK_COR_SEQ_2_3 = 10'b0100000000; + parameter [9:0] CLK_COR_SEQ_2_4 = 10'b0100000000; + parameter [3:0] CLK_COR_SEQ_2_ENABLE = 4'b1111; + parameter CLK_COR_SEQ_2_USE = "FALSE"; + parameter integer CLK_COR_SEQ_LEN = 1; + parameter DEC_MCOMMA_DETECT = "TRUE"; + parameter DEC_PCOMMA_DETECT = "TRUE"; + parameter DEC_VALID_COMMA_ONLY = "TRUE"; + parameter [23:0] DMONITOR_CFG = 24'h000A00; + parameter [0:0] ES_CLK_PHASE_SEL = 1'b0; + parameter [5:0] ES_CONTROL = 6'b000000; + parameter ES_ERRDET_EN = "FALSE"; + parameter ES_EYE_SCAN_EN = "FALSE"; + parameter [11:0] ES_HORZ_OFFSET = 12'h010; + parameter [9:0] ES_PMA_CFG = 10'b0000000000; + parameter [4:0] ES_PRESCALE = 5'b00000; + parameter [79:0] ES_QUALIFIER = 80'h00000000000000000000; + parameter [79:0] ES_QUAL_MASK = 80'h00000000000000000000; + parameter [79:0] ES_SDATA_MASK = 80'h00000000000000000000; + parameter [8:0] ES_VERT_OFFSET = 9'b000000000; + parameter [3:0] FTS_DESKEW_SEQ_ENABLE = 4'b1111; + parameter [3:0] FTS_LANE_DESKEW_CFG = 4'b1111; + parameter FTS_LANE_DESKEW_EN = "FALSE"; + parameter [2:0] GEARBOX_MODE = 3'b000; + parameter [0:0] IS_CLKRSVD0_INVERTED = 1'b0; + parameter [0:0] IS_CLKRSVD1_INVERTED = 1'b0; + parameter [0:0] IS_DMONITORCLK_INVERTED = 1'b0; + parameter [0:0] IS_DRPCLK_INVERTED = 1'b0; + parameter [0:0] IS_RXUSRCLK2_INVERTED = 1'b0; + parameter [0:0] IS_RXUSRCLK_INVERTED = 1'b0; + parameter [0:0] IS_SIGVALIDCLK_INVERTED = 1'b0; + parameter [0:0] IS_TXPHDLYTSTCLK_INVERTED = 1'b0; + parameter [0:0] IS_TXUSRCLK2_INVERTED = 1'b0; + parameter [0:0] IS_TXUSRCLK_INVERTED = 1'b0; + parameter [0:0] LOOPBACK_CFG = 1'b0; + parameter [1:0] OUTREFCLK_SEL_INV = 2'b11; + parameter PCS_PCIE_EN = "FALSE"; + parameter [47:0] PCS_RSVD_ATTR = 48'h000000000000; + parameter [11:0] PD_TRANS_TIME_FROM_P2 = 12'h03C; + parameter [7:0] PD_TRANS_TIME_NONE_P2 = 8'h19; + parameter [7:0] PD_TRANS_TIME_TO_P2 = 8'h64; + parameter [0:0] PMA_LOOPBACK_CFG = 1'b0; + parameter [31:0] PMA_RSV = 32'h00000333; + parameter [31:0] PMA_RSV2 = 32'h00002050; + parameter [1:0] PMA_RSV3 = 2'b00; + parameter [3:0] PMA_RSV4 = 4'b0000; + parameter [0:0] PMA_RSV5 = 1'b0; + parameter [0:0] PMA_RSV6 = 1'b0; + parameter [0:0] PMA_RSV7 = 1'b0; + parameter [4:0] RXBUFRESET_TIME = 5'b00001; + parameter RXBUF_ADDR_MODE = "FULL"; + parameter [3:0] RXBUF_EIDLE_HI_CNT = 4'b1000; + parameter [3:0] RXBUF_EIDLE_LO_CNT = 4'b0000; + parameter RXBUF_EN = "TRUE"; + parameter RXBUF_RESET_ON_CB_CHANGE = "TRUE"; + parameter RXBUF_RESET_ON_COMMAALIGN = "FALSE"; + parameter RXBUF_RESET_ON_EIDLE = "FALSE"; + parameter RXBUF_RESET_ON_RATE_CHANGE = "TRUE"; + parameter integer RXBUF_THRESH_OVFLW = 61; + parameter RXBUF_THRESH_OVRD = "FALSE"; + parameter integer RXBUF_THRESH_UNDFLW = 4; + parameter [4:0] RXCDRFREQRESET_TIME = 5'b00001; + parameter [4:0] RXCDRPHRESET_TIME = 5'b00001; + parameter [82:0] RXCDR_CFG = 83'h0000107FE406001041010; + parameter [0:0] RXCDR_FR_RESET_ON_EIDLE = 1'b0; + parameter [0:0] RXCDR_HOLD_DURING_EIDLE = 1'b0; + parameter [5:0] RXCDR_LOCK_CFG = 6'b001001; + parameter [0:0] RXCDR_PH_RESET_ON_EIDLE = 1'b0; + parameter [15:0] RXDLY_CFG = 16'h0010; + parameter [8:0] RXDLY_LCFG = 9'h020; + parameter [15:0] RXDLY_TAP_CFG = 16'h0000; + parameter RXGEARBOX_EN = "FALSE"; + parameter [4:0] RXISCANRESET_TIME = 5'b00001; + parameter [6:0] RXLPMRESET_TIME = 7'b0001111; + parameter [0:0] RXLPM_BIAS_STARTUP_DISABLE = 1'b0; + parameter [3:0] RXLPM_CFG = 4'b0110; + parameter [0:0] RXLPM_CFG1 = 1'b0; + parameter [0:0] RXLPM_CM_CFG = 1'b0; + parameter [8:0] RXLPM_GC_CFG = 9'b111100010; + parameter [2:0] RXLPM_GC_CFG2 = 3'b001; + parameter [13:0] RXLPM_HF_CFG = 14'b00001111110000; + parameter [4:0] RXLPM_HF_CFG2 = 5'b01010; + parameter [3:0] RXLPM_HF_CFG3 = 4'b0000; + parameter [0:0] RXLPM_HOLD_DURING_EIDLE = 1'b0; + parameter [0:0] RXLPM_INCM_CFG = 1'b0; + parameter [0:0] RXLPM_IPCM_CFG = 1'b0; + parameter [17:0] RXLPM_LF_CFG = 18'b000000001111110000; + parameter [4:0] RXLPM_LF_CFG2 = 5'b01010; + parameter [2:0] RXLPM_OSINT_CFG = 3'b100; + parameter [6:0] RXOOB_CFG = 7'b0000110; + parameter RXOOB_CLK_CFG = "PMA"; + parameter [4:0] RXOSCALRESET_TIME = 5'b00011; + parameter [4:0] RXOSCALRESET_TIMEOUT = 5'b00000; + parameter integer RXOUT_DIV = 2; + parameter [4:0] RXPCSRESET_TIME = 5'b00001; + parameter [23:0] RXPHDLY_CFG = 24'h084000; + parameter [23:0] RXPH_CFG = 24'hC00002; + parameter [4:0] RXPH_MONITOR_SEL = 5'b00000; + parameter [2:0] RXPI_CFG0 = 3'b000; + parameter [0:0] RXPI_CFG1 = 1'b0; + parameter [0:0] RXPI_CFG2 = 1'b0; + parameter [4:0] RXPMARESET_TIME = 5'b00011; + parameter [0:0] RXPRBS_ERR_LOOPBACK = 1'b0; + parameter integer RXSLIDE_AUTO_WAIT = 7; + parameter RXSLIDE_MODE = "OFF"; + parameter [0:0] RXSYNC_MULTILANE = 1'b0; + parameter [0:0] RXSYNC_OVRD = 1'b0; + parameter [0:0] RXSYNC_SKIP_DA = 1'b0; + parameter [15:0] RX_BIAS_CFG = 16'b0000111100110011; + parameter [5:0] RX_BUFFER_CFG = 6'b000000; + parameter integer RX_CLK25_DIV = 7; + parameter [0:0] RX_CLKMUX_EN = 1'b1; + parameter [1:0] RX_CM_SEL = 2'b11; + parameter [3:0] RX_CM_TRIM = 4'b0100; + parameter integer RX_DATA_WIDTH = 20; + parameter [5:0] RX_DDI_SEL = 6'b000000; + parameter [13:0] RX_DEBUG_CFG = 14'b00000000000000; + parameter RX_DEFER_RESET_BUF_EN = "TRUE"; + parameter RX_DISPERR_SEQ_MATCH = "TRUE"; + parameter [12:0] RX_OS_CFG = 13'b0001111110000; + parameter integer RX_SIG_VALID_DLY = 10; + parameter RX_XCLK_SEL = "RXREC"; + parameter integer SAS_MAX_COM = 64; + parameter integer SAS_MIN_COM = 36; + parameter [3:0] SATA_BURST_SEQ_LEN = 4'b1111; + parameter [2:0] SATA_BURST_VAL = 3'b100; + parameter [2:0] SATA_EIDLE_VAL = 3'b100; + parameter integer SATA_MAX_BURST = 8; + parameter integer SATA_MAX_INIT = 21; + parameter integer SATA_MAX_WAKE = 7; + parameter integer SATA_MIN_BURST = 4; + parameter integer SATA_MIN_INIT = 12; + parameter integer SATA_MIN_WAKE = 4; + parameter SATA_PLL_CFG = "VCO_3000MHZ"; + parameter SHOW_REALIGN_COMMA = "TRUE"; + parameter SIM_RECEIVER_DETECT_PASS = "TRUE"; + parameter SIM_RESET_SPEEDUP = "TRUE"; + parameter SIM_TX_EIDLE_DRIVE_LEVEL = "X"; + parameter SIM_VERSION = "1.0"; + parameter [14:0] TERM_RCAL_CFG = 15'b100001000010000; + parameter [2:0] TERM_RCAL_OVRD = 3'b000; + parameter [7:0] TRANS_TIME_RATE = 8'h0E; + parameter [31:0] TST_RSV = 32'h00000000; + parameter TXBUF_EN = "TRUE"; + parameter TXBUF_RESET_ON_RATE_CHANGE = "FALSE"; + parameter [15:0] TXDLY_CFG = 16'h0010; + parameter [8:0] TXDLY_LCFG = 9'h020; + parameter [15:0] TXDLY_TAP_CFG = 16'h0000; + parameter TXGEARBOX_EN = "FALSE"; + parameter [0:0] TXOOB_CFG = 1'b0; + parameter integer TXOUT_DIV = 2; + parameter [4:0] TXPCSRESET_TIME = 5'b00001; + parameter [23:0] TXPHDLY_CFG = 24'h084000; + parameter [15:0] TXPH_CFG = 16'h0400; + parameter [4:0] TXPH_MONITOR_SEL = 5'b00000; + parameter [1:0] TXPI_CFG0 = 2'b00; + parameter [1:0] TXPI_CFG1 = 2'b00; + parameter [1:0] TXPI_CFG2 = 2'b00; + parameter [0:0] TXPI_CFG3 = 1'b0; + parameter [0:0] TXPI_CFG4 = 1'b0; + parameter [2:0] TXPI_CFG5 = 3'b000; + parameter [0:0] TXPI_GREY_SEL = 1'b0; + parameter [0:0] TXPI_INVSTROBE_SEL = 1'b0; + parameter TXPI_PPMCLK_SEL = "TXUSRCLK2"; + parameter [7:0] TXPI_PPM_CFG = 8'b00000000; + parameter [2:0] TXPI_SYNFREQ_PPM = 3'b000; + parameter [4:0] TXPMARESET_TIME = 5'b00001; + parameter [0:0] TXSYNC_MULTILANE = 1'b0; + parameter [0:0] TXSYNC_OVRD = 1'b0; + parameter [0:0] TXSYNC_SKIP_DA = 1'b0; + parameter integer TX_CLK25_DIV = 7; + parameter [0:0] TX_CLKMUX_EN = 1'b1; + parameter integer TX_DATA_WIDTH = 20; + parameter [5:0] TX_DEEMPH0 = 6'b000000; + parameter [5:0] TX_DEEMPH1 = 6'b000000; + parameter TX_DRIVE_MODE = "DIRECT"; + parameter [2:0] TX_EIDLE_ASSERT_DELAY = 3'b110; + parameter [2:0] TX_EIDLE_DEASSERT_DELAY = 3'b100; + parameter TX_LOOPBACK_DRIVE_HIZ = "FALSE"; + parameter [0:0] TX_MAINCURSOR_SEL = 1'b0; + parameter [6:0] TX_MARGIN_FULL_0 = 7'b1001110; + parameter [6:0] TX_MARGIN_FULL_1 = 7'b1001001; + parameter [6:0] TX_MARGIN_FULL_2 = 7'b1000101; + parameter [6:0] TX_MARGIN_FULL_3 = 7'b1000010; + parameter [6:0] TX_MARGIN_FULL_4 = 7'b1000000; + parameter [6:0] TX_MARGIN_LOW_0 = 7'b1000110; + parameter [6:0] TX_MARGIN_LOW_1 = 7'b1000100; + parameter [6:0] TX_MARGIN_LOW_2 = 7'b1000010; + parameter [6:0] TX_MARGIN_LOW_3 = 7'b1000000; + parameter [6:0] TX_MARGIN_LOW_4 = 7'b1000000; + parameter [0:0] TX_PREDRIVER_MODE = 1'b0; + parameter [13:0] TX_RXDETECT_CFG = 14'h1832; + parameter [2:0] TX_RXDETECT_REF = 3'b100; + parameter TX_XCLK_SEL = "TXUSR"; + parameter [0:0] UCODEER_CLR = 1'b0; + parameter [0:0] USE_PCS_CLK_PHASE_SEL = 1'b0; + output DRPRDY; + output EYESCANDATAERROR; + output GTPTXN; + output GTPTXP; + output PHYSTATUS; + output PMARSVDOUT0; + output PMARSVDOUT1; + output RXBYTEISALIGNED; + output RXBYTEREALIGN; + output RXCDRLOCK; + output RXCHANBONDSEQ; + output RXCHANISALIGNED; + output RXCHANREALIGN; + output RXCOMINITDET; + output RXCOMMADET; + output RXCOMSASDET; + output RXCOMWAKEDET; + output RXDLYSRESETDONE; + output RXELECIDLE; + output RXHEADERVALID; + output RXOSINTDONE; + output RXOSINTSTARTED; + output RXOSINTSTROBEDONE; + output RXOSINTSTROBESTARTED; + output RXOUTCLK; + output RXOUTCLKFABRIC; + output RXOUTCLKPCS; + output RXPHALIGNDONE; + output RXPMARESETDONE; + output RXPRBSERR; + output RXRATEDONE; + output RXRESETDONE; + output RXSYNCDONE; + output RXSYNCOUT; + output RXVALID; + output TXCOMFINISH; + output TXDLYSRESETDONE; + output TXGEARBOXREADY; + output TXOUTCLK; + output TXOUTCLKFABRIC; + output TXOUTCLKPCS; + output TXPHALIGNDONE; + output TXPHINITDONE; + output TXPMARESETDONE; + output TXRATEDONE; + output TXRESETDONE; + output TXSYNCDONE; + output TXSYNCOUT; + output [14:0] DMONITOROUT; + output [15:0] DRPDO; + output [15:0] PCSRSVDOUT; + output [1:0] RXCLKCORCNT; + output [1:0] RXDATAVALID; + output [1:0] RXSTARTOFSEQ; + output [1:0] TXBUFSTATUS; + output [2:0] RXBUFSTATUS; + output [2:0] RXHEADER; + output [2:0] RXSTATUS; + output [31:0] RXDATA; + output [3:0] RXCHARISCOMMA; + output [3:0] RXCHARISK; + output [3:0] RXCHBONDO; + output [3:0] RXDISPERR; + output [3:0] RXNOTINTABLE; + output [4:0] RXPHMONITOR; + output [4:0] RXPHSLIPMONITOR; + input CFGRESET; + input CLKRSVD0; + input CLKRSVD1; + input DMONFIFORESET; + input DMONITORCLK; + input DRPCLK; + input DRPEN; + input DRPWE; + input EYESCANMODE; + input EYESCANRESET; + input EYESCANTRIGGER; + input GTPRXN; + input GTPRXP; + input GTRESETSEL; + input GTRXRESET; + input GTTXRESET; + input PLL0CLK; + input PLL0REFCLK; + input PLL1CLK; + input PLL1REFCLK; + input PMARSVDIN0; + input PMARSVDIN1; + input PMARSVDIN2; + input PMARSVDIN3; + input PMARSVDIN4; + input RESETOVRD; + input RX8B10BEN; + input RXBUFRESET; + input RXCDRFREQRESET; + input RXCDRHOLD; + input RXCDROVRDEN; + input RXCDRRESET; + input RXCDRRESETRSV; + input RXCHBONDEN; + input RXCHBONDMASTER; + input RXCHBONDSLAVE; + input RXCOMMADETEN; + input RXDDIEN; + input RXDFEXYDEN; + input RXDLYBYPASS; + input RXDLYEN; + input RXDLYOVRDEN; + input RXDLYSRESET; + input RXGEARBOXSLIP; + input RXLPMHFHOLD; + input RXLPMHFOVRDEN; + input RXLPMLFHOLD; + input RXLPMLFOVRDEN; + input RXLPMOSINTNTRLEN; + input RXLPMRESET; + input RXMCOMMAALIGNEN; + input RXOOBRESET; + input RXOSCALRESET; + input RXOSHOLD; + input RXOSINTEN; + input RXOSINTHOLD; + input RXOSINTNTRLEN; + input RXOSINTOVRDEN; + input RXOSINTPD; + input RXOSINTSTROBE; + input RXOSINTTESTOVRDEN; + input RXOSOVRDEN; + input RXPCOMMAALIGNEN; + input RXPCSRESET; + input RXPHALIGN; + input RXPHALIGNEN; + input RXPHDLYPD; + input RXPHDLYRESET; + input RXPHOVRDEN; + input RXPMARESET; + input RXPOLARITY; + input RXPRBSCNTRESET; + input RXRATEMODE; + input RXSLIDE; + input RXSYNCALLIN; + input RXSYNCIN; + input RXSYNCMODE; + input RXUSERRDY; + input RXUSRCLK2; + input RXUSRCLK; + input SETERRSTATUS; + input SIGVALIDCLK; + input TX8B10BEN; + input TXCOMINIT; + input TXCOMSAS; + input TXCOMWAKE; + input TXDEEMPH; + input TXDETECTRX; + input TXDIFFPD; + input TXDLYBYPASS; + input TXDLYEN; + input TXDLYHOLD; + input TXDLYOVRDEN; + input TXDLYSRESET; + input TXDLYUPDOWN; + input TXELECIDLE; + input TXINHIBIT; + input TXPCSRESET; + input TXPDELECIDLEMODE; + input TXPHALIGN; + input TXPHALIGNEN; + input TXPHDLYPD; + input TXPHDLYRESET; + input TXPHDLYTSTCLK; + input TXPHINIT; + input TXPHOVRDEN; + input TXPIPPMEN; + input TXPIPPMOVRDEN; + input TXPIPPMPD; + input TXPIPPMSEL; + input TXPISOPD; + input TXPMARESET; + input TXPOLARITY; + input TXPOSTCURSORINV; + input TXPRBSFORCEERR; + input TXPRECURSORINV; + input TXRATEMODE; + input TXSTARTSEQ; + input TXSWING; + input TXSYNCALLIN; + input TXSYNCIN; + input TXSYNCMODE; + input TXUSERRDY; + input TXUSRCLK2; + input TXUSRCLK; + input [13:0] RXADAPTSELTEST; + input [15:0] DRPDI; + input [15:0] GTRSVD; + input [15:0] PCSRSVDIN; + input [19:0] TSTIN; + input [1:0] RXELECIDLEMODE; + input [1:0] RXPD; + input [1:0] RXSYSCLKSEL; + input [1:0] TXPD; + input [1:0] TXSYSCLKSEL; + input [2:0] LOOPBACK; + input [2:0] RXCHBONDLEVEL; + input [2:0] RXOUTCLKSEL; + input [2:0] RXPRBSSEL; + input [2:0] RXRATE; + input [2:0] TXBUFDIFFCTRL; + input [2:0] TXHEADER; + input [2:0] TXMARGIN; + input [2:0] TXOUTCLKSEL; + input [2:0] TXPRBSSEL; + input [2:0] TXRATE; + input [31:0] TXDATA; + input [3:0] RXCHBONDI; + input [3:0] RXOSINTCFG; + input [3:0] RXOSINTID0; + input [3:0] TX8B10BBYPASS; + input [3:0] TXCHARDISPMODE; + input [3:0] TXCHARDISPVAL; + input [3:0] TXCHARISK; + input [3:0] TXDIFFCTRL; + input [4:0] TXPIPPMSTEPSIZE; + input [4:0] TXPOSTCURSOR; + input [4:0] TXPRECURSOR; + input [6:0] TXMAINCURSOR; + input [6:0] TXSEQUENCE; + input [8:0] DRPADDR; +endmodule + +module GTPE2_COMMON (...); + parameter [63:0] BIAS_CFG = 64'h0000000000000000; + parameter [31:0] COMMON_CFG = 32'h00000000; + parameter [0:0] IS_DRPCLK_INVERTED = 1'b0; + parameter [0:0] IS_GTGREFCLK0_INVERTED = 1'b0; + parameter [0:0] IS_GTGREFCLK1_INVERTED = 1'b0; + parameter [0:0] IS_PLL0LOCKDETCLK_INVERTED = 1'b0; + parameter [0:0] IS_PLL1LOCKDETCLK_INVERTED = 1'b0; + parameter [26:0] PLL0_CFG = 27'h01F03DC; + parameter [0:0] PLL0_DMON_CFG = 1'b0; + parameter integer PLL0_FBDIV = 4; + parameter integer PLL0_FBDIV_45 = 5; + parameter [23:0] PLL0_INIT_CFG = 24'h00001E; + parameter [8:0] PLL0_LOCK_CFG = 9'h1E8; + parameter integer PLL0_REFCLK_DIV = 1; + parameter [26:0] PLL1_CFG = 27'h01F03DC; + parameter [0:0] PLL1_DMON_CFG = 1'b0; + parameter integer PLL1_FBDIV = 4; + parameter integer PLL1_FBDIV_45 = 5; + parameter [23:0] PLL1_INIT_CFG = 24'h00001E; + parameter [8:0] PLL1_LOCK_CFG = 9'h1E8; + parameter integer PLL1_REFCLK_DIV = 1; + parameter [7:0] PLL_CLKOUT_CFG = 8'b00000000; + parameter [15:0] RSVD_ATTR0 = 16'h0000; + parameter [15:0] RSVD_ATTR1 = 16'h0000; + parameter [2:0] SIM_PLL0REFCLK_SEL = 3'b001; + parameter [2:0] SIM_PLL1REFCLK_SEL = 3'b001; + parameter SIM_RESET_SPEEDUP = "TRUE"; + parameter SIM_VERSION = "1.0"; + output DRPRDY; + output PLL0FBCLKLOST; + output PLL0LOCK; + output PLL0OUTCLK; + output PLL0OUTREFCLK; + output PLL0REFCLKLOST; + output PLL1FBCLKLOST; + output PLL1LOCK; + output PLL1OUTCLK; + output PLL1OUTREFCLK; + output PLL1REFCLKLOST; + output REFCLKOUTMONITOR0; + output REFCLKOUTMONITOR1; + output [15:0] DRPDO; + output [15:0] PMARSVDOUT; + output [7:0] DMONITOROUT; + input BGBYPASSB; + input BGMONITORENB; + input BGPDB; + input BGRCALOVRDENB; + input DRPCLK; + input DRPEN; + input DRPWE; + input GTEASTREFCLK0; + input GTEASTREFCLK1; + input GTGREFCLK0; + input GTGREFCLK1; + input GTREFCLK0; + input GTREFCLK1; + input GTWESTREFCLK0; + input GTWESTREFCLK1; + input PLL0LOCKDETCLK; + input PLL0LOCKEN; + input PLL0PD; + input PLL0RESET; + input PLL1LOCKDETCLK; + input PLL1LOCKEN; + input PLL1PD; + input PLL1RESET; + input RCALENB; + input [15:0] DRPDI; + input [15:0] PLLRSVD1; + input [2:0] PLL0REFCLKSEL; + input [2:0] PLL1REFCLKSEL; + input [4:0] BGRCALOVRD; + input [4:0] PLLRSVD2; + input [7:0] DRPADDR; + input [7:0] PMARSVD; +endmodule + +module GTXE2_CHANNEL (...); + parameter ALIGN_COMMA_DOUBLE = "FALSE"; + parameter [9:0] ALIGN_COMMA_ENABLE = 10'b0001111111; + parameter integer ALIGN_COMMA_WORD = 1; + parameter ALIGN_MCOMMA_DET = "TRUE"; + parameter [9:0] ALIGN_MCOMMA_VALUE = 10'b1010000011; + parameter ALIGN_PCOMMA_DET = "TRUE"; + parameter [9:0] ALIGN_PCOMMA_VALUE = 10'b0101111100; + parameter CBCC_DATA_SOURCE_SEL = "DECODED"; + parameter CHAN_BOND_KEEP_ALIGN = "FALSE"; + parameter integer CHAN_BOND_MAX_SKEW = 7; + parameter [9:0] CHAN_BOND_SEQ_1_1 = 10'b0101111100; + parameter [9:0] CHAN_BOND_SEQ_1_2 = 10'b0000000000; + parameter [9:0] CHAN_BOND_SEQ_1_3 = 10'b0000000000; + parameter [9:0] CHAN_BOND_SEQ_1_4 = 10'b0000000000; + parameter [3:0] CHAN_BOND_SEQ_1_ENABLE = 4'b1111; + parameter [9:0] CHAN_BOND_SEQ_2_1 = 10'b0100000000; + parameter [9:0] CHAN_BOND_SEQ_2_2 = 10'b0100000000; + parameter [9:0] CHAN_BOND_SEQ_2_3 = 10'b0100000000; + parameter [9:0] CHAN_BOND_SEQ_2_4 = 10'b0100000000; + parameter [3:0] CHAN_BOND_SEQ_2_ENABLE = 4'b1111; + parameter CHAN_BOND_SEQ_2_USE = "FALSE"; + parameter integer CHAN_BOND_SEQ_LEN = 1; + parameter CLK_CORRECT_USE = "TRUE"; + parameter CLK_COR_KEEP_IDLE = "FALSE"; + parameter integer CLK_COR_MAX_LAT = 20; + parameter integer CLK_COR_MIN_LAT = 18; + parameter CLK_COR_PRECEDENCE = "TRUE"; + parameter integer CLK_COR_REPEAT_WAIT = 0; + parameter [9:0] CLK_COR_SEQ_1_1 = 10'b0100011100; + parameter [9:0] CLK_COR_SEQ_1_2 = 10'b0000000000; + parameter [9:0] CLK_COR_SEQ_1_3 = 10'b0000000000; + parameter [9:0] CLK_COR_SEQ_1_4 = 10'b0000000000; + parameter [3:0] CLK_COR_SEQ_1_ENABLE = 4'b1111; + parameter [9:0] CLK_COR_SEQ_2_1 = 10'b0100000000; + parameter [9:0] CLK_COR_SEQ_2_2 = 10'b0100000000; + parameter [9:0] CLK_COR_SEQ_2_3 = 10'b0100000000; + parameter [9:0] CLK_COR_SEQ_2_4 = 10'b0100000000; + parameter [3:0] CLK_COR_SEQ_2_ENABLE = 4'b1111; + parameter CLK_COR_SEQ_2_USE = "FALSE"; + parameter integer CLK_COR_SEQ_LEN = 1; + parameter [23:0] CPLL_CFG = 24'hB007D8; + parameter integer CPLL_FBDIV = 4; + parameter integer CPLL_FBDIV_45 = 5; + parameter [23:0] CPLL_INIT_CFG = 24'h00001E; + parameter [15:0] CPLL_LOCK_CFG = 16'h01E8; + parameter integer CPLL_REFCLK_DIV = 1; + parameter DEC_MCOMMA_DETECT = "TRUE"; + parameter DEC_PCOMMA_DETECT = "TRUE"; + parameter DEC_VALID_COMMA_ONLY = "TRUE"; + parameter [23:0] DMONITOR_CFG = 24'h000A00; + parameter [5:0] ES_CONTROL = 6'b000000; + parameter ES_ERRDET_EN = "FALSE"; + parameter ES_EYE_SCAN_EN = "FALSE"; + parameter [11:0] ES_HORZ_OFFSET = 12'h000; + parameter [9:0] ES_PMA_CFG = 10'b0000000000; + parameter [4:0] ES_PRESCALE = 5'b00000; + parameter [79:0] ES_QUALIFIER = 80'h00000000000000000000; + parameter [79:0] ES_QUAL_MASK = 80'h00000000000000000000; + parameter [79:0] ES_SDATA_MASK = 80'h00000000000000000000; + parameter [8:0] ES_VERT_OFFSET = 9'b000000000; + parameter [3:0] FTS_DESKEW_SEQ_ENABLE = 4'b1111; + parameter [3:0] FTS_LANE_DESKEW_CFG = 4'b1111; + parameter FTS_LANE_DESKEW_EN = "FALSE"; + parameter [2:0] GEARBOX_MODE = 3'b000; + parameter [0:0] IS_CPLLLOCKDETCLK_INVERTED = 1'b0; + parameter [0:0] IS_DRPCLK_INVERTED = 1'b0; + parameter [0:0] IS_GTGREFCLK_INVERTED = 1'b0; + parameter [0:0] IS_RXUSRCLK2_INVERTED = 1'b0; + parameter [0:0] IS_RXUSRCLK_INVERTED = 1'b0; + parameter [0:0] IS_TXPHDLYTSTCLK_INVERTED = 1'b0; + parameter [0:0] IS_TXUSRCLK2_INVERTED = 1'b0; + parameter [0:0] IS_TXUSRCLK_INVERTED = 1'b0; + parameter [1:0] OUTREFCLK_SEL_INV = 2'b11; + parameter PCS_PCIE_EN = "FALSE"; + parameter [47:0] PCS_RSVD_ATTR = 48'h000000000000; + parameter [11:0] PD_TRANS_TIME_FROM_P2 = 12'h03C; + parameter [7:0] PD_TRANS_TIME_NONE_P2 = 8'h19; + parameter [7:0] PD_TRANS_TIME_TO_P2 = 8'h64; + parameter [31:0] PMA_RSV = 32'h00000000; + parameter [15:0] PMA_RSV2 = 16'h2050; + parameter [1:0] PMA_RSV3 = 2'b00; + parameter [31:0] PMA_RSV4 = 32'h00000000; + parameter [4:0] RXBUFRESET_TIME = 5'b00001; + parameter RXBUF_ADDR_MODE = "FULL"; + parameter [3:0] RXBUF_EIDLE_HI_CNT = 4'b1000; + parameter [3:0] RXBUF_EIDLE_LO_CNT = 4'b0000; + parameter RXBUF_EN = "TRUE"; + parameter RXBUF_RESET_ON_CB_CHANGE = "TRUE"; + parameter RXBUF_RESET_ON_COMMAALIGN = "FALSE"; + parameter RXBUF_RESET_ON_EIDLE = "FALSE"; + parameter RXBUF_RESET_ON_RATE_CHANGE = "TRUE"; + parameter integer RXBUF_THRESH_OVFLW = 61; + parameter RXBUF_THRESH_OVRD = "FALSE"; + parameter integer RXBUF_THRESH_UNDFLW = 4; + parameter [4:0] RXCDRFREQRESET_TIME = 5'b00001; + parameter [4:0] RXCDRPHRESET_TIME = 5'b00001; + parameter [71:0] RXCDR_CFG = 72'h0B000023FF20400020; + parameter [0:0] RXCDR_FR_RESET_ON_EIDLE = 1'b0; + parameter [0:0] RXCDR_HOLD_DURING_EIDLE = 1'b0; + parameter [5:0] RXCDR_LOCK_CFG = 6'b010101; + parameter [0:0] RXCDR_PH_RESET_ON_EIDLE = 1'b0; + parameter [6:0] RXDFELPMRESET_TIME = 7'b0001111; + parameter [15:0] RXDLY_CFG = 16'h001F; + parameter [8:0] RXDLY_LCFG = 9'h030; + parameter [15:0] RXDLY_TAP_CFG = 16'h0000; + parameter RXGEARBOX_EN = "FALSE"; + parameter [4:0] RXISCANRESET_TIME = 5'b00001; + parameter [13:0] RXLPM_HF_CFG = 14'b00000011110000; + parameter [13:0] RXLPM_LF_CFG = 14'b00000011110000; + parameter [6:0] RXOOB_CFG = 7'b0000110; + parameter integer RXOUT_DIV = 2; + parameter [4:0] RXPCSRESET_TIME = 5'b00001; + parameter [23:0] RXPHDLY_CFG = 24'h084020; + parameter [23:0] RXPH_CFG = 24'h000000; + parameter [4:0] RXPH_MONITOR_SEL = 5'b00000; + parameter [4:0] RXPMARESET_TIME = 5'b00011; + parameter [0:0] RXPRBS_ERR_LOOPBACK = 1'b0; + parameter integer RXSLIDE_AUTO_WAIT = 7; + parameter RXSLIDE_MODE = "OFF"; + parameter [11:0] RX_BIAS_CFG = 12'b000000000000; + parameter [5:0] RX_BUFFER_CFG = 6'b000000; + parameter integer RX_CLK25_DIV = 7; + parameter [0:0] RX_CLKMUX_PD = 1'b1; + parameter [1:0] RX_CM_SEL = 2'b11; + parameter [2:0] RX_CM_TRIM = 3'b100; + parameter integer RX_DATA_WIDTH = 20; + parameter [5:0] RX_DDI_SEL = 6'b000000; + parameter [11:0] RX_DEBUG_CFG = 12'b000000000000; + parameter RX_DEFER_RESET_BUF_EN = "TRUE"; + parameter [22:0] RX_DFE_GAIN_CFG = 23'h180E0F; + parameter [11:0] RX_DFE_H2_CFG = 12'b000111100000; + parameter [11:0] RX_DFE_H3_CFG = 12'b000111100000; + parameter [10:0] RX_DFE_H4_CFG = 11'b00011110000; + parameter [10:0] RX_DFE_H5_CFG = 11'b00011110000; + parameter [12:0] RX_DFE_KL_CFG = 13'b0001111110000; + parameter [31:0] RX_DFE_KL_CFG2 = 32'h3008E56A; + parameter [15:0] RX_DFE_LPM_CFG = 16'h0904; + parameter [0:0] RX_DFE_LPM_HOLD_DURING_EIDLE = 1'b0; + parameter [16:0] RX_DFE_UT_CFG = 17'b00111111000000000; + parameter [16:0] RX_DFE_VP_CFG = 17'b00011111100000000; + parameter [12:0] RX_DFE_XYD_CFG = 13'b0000000010000; + parameter RX_DISPERR_SEQ_MATCH = "TRUE"; + parameter integer RX_INT_DATAWIDTH = 0; + parameter [12:0] RX_OS_CFG = 13'b0001111110000; + parameter integer RX_SIG_VALID_DLY = 10; + parameter RX_XCLK_SEL = "RXREC"; + parameter integer SAS_MAX_COM = 64; + parameter integer SAS_MIN_COM = 36; + parameter [3:0] SATA_BURST_SEQ_LEN = 4'b1111; + parameter [2:0] SATA_BURST_VAL = 3'b100; + parameter SATA_CPLL_CFG = "VCO_3000MHZ"; + parameter [2:0] SATA_EIDLE_VAL = 3'b100; + parameter integer SATA_MAX_BURST = 8; + parameter integer SATA_MAX_INIT = 21; + parameter integer SATA_MAX_WAKE = 7; + parameter integer SATA_MIN_BURST = 4; + parameter integer SATA_MIN_INIT = 12; + parameter integer SATA_MIN_WAKE = 4; + parameter SHOW_REALIGN_COMMA = "TRUE"; + parameter [2:0] SIM_CPLLREFCLK_SEL = 3'b001; + parameter SIM_RECEIVER_DETECT_PASS = "TRUE"; + parameter SIM_RESET_SPEEDUP = "TRUE"; + parameter SIM_TX_EIDLE_DRIVE_LEVEL = "X"; + parameter SIM_VERSION = "4.0"; + parameter [4:0] TERM_RCAL_CFG = 5'b10000; + parameter [0:0] TERM_RCAL_OVRD = 1'b0; + parameter [7:0] TRANS_TIME_RATE = 8'h0E; + parameter [31:0] TST_RSV = 32'h00000000; + parameter TXBUF_EN = "TRUE"; + parameter TXBUF_RESET_ON_RATE_CHANGE = "FALSE"; + parameter [15:0] TXDLY_CFG = 16'h001F; + parameter [8:0] TXDLY_LCFG = 9'h030; + parameter [15:0] TXDLY_TAP_CFG = 16'h0000; + parameter TXGEARBOX_EN = "FALSE"; + parameter integer TXOUT_DIV = 2; + parameter [4:0] TXPCSRESET_TIME = 5'b00001; + parameter [23:0] TXPHDLY_CFG = 24'h084020; + parameter [15:0] TXPH_CFG = 16'h0780; + parameter [4:0] TXPH_MONITOR_SEL = 5'b00000; + parameter [4:0] TXPMARESET_TIME = 5'b00001; + parameter integer TX_CLK25_DIV = 7; + parameter [0:0] TX_CLKMUX_PD = 1'b1; + parameter integer TX_DATA_WIDTH = 20; + parameter [4:0] TX_DEEMPH0 = 5'b00000; + parameter [4:0] TX_DEEMPH1 = 5'b00000; + parameter TX_DRIVE_MODE = "DIRECT"; + parameter [2:0] TX_EIDLE_ASSERT_DELAY = 3'b110; + parameter [2:0] TX_EIDLE_DEASSERT_DELAY = 3'b100; + parameter integer TX_INT_DATAWIDTH = 0; + parameter TX_LOOPBACK_DRIVE_HIZ = "FALSE"; + parameter [0:0] TX_MAINCURSOR_SEL = 1'b0; + parameter [6:0] TX_MARGIN_FULL_0 = 7'b1001110; + parameter [6:0] TX_MARGIN_FULL_1 = 7'b1001001; + parameter [6:0] TX_MARGIN_FULL_2 = 7'b1000101; + parameter [6:0] TX_MARGIN_FULL_3 = 7'b1000010; + parameter [6:0] TX_MARGIN_FULL_4 = 7'b1000000; + parameter [6:0] TX_MARGIN_LOW_0 = 7'b1000110; + parameter [6:0] TX_MARGIN_LOW_1 = 7'b1000100; + parameter [6:0] TX_MARGIN_LOW_2 = 7'b1000010; + parameter [6:0] TX_MARGIN_LOW_3 = 7'b1000000; + parameter [6:0] TX_MARGIN_LOW_4 = 7'b1000000; + parameter [0:0] TX_PREDRIVER_MODE = 1'b0; + parameter [0:0] TX_QPI_STATUS_EN = 1'b0; + parameter [13:0] TX_RXDETECT_CFG = 14'h1832; + parameter [2:0] TX_RXDETECT_REF = 3'b100; + parameter TX_XCLK_SEL = "TXUSR"; + parameter [0:0] UCODEER_CLR = 1'b0; + output CPLLFBCLKLOST; + output CPLLLOCK; + output CPLLREFCLKLOST; + output DRPRDY; + output EYESCANDATAERROR; + output GTREFCLKMONITOR; + output GTXTXN; + output GTXTXP; + output PHYSTATUS; + output RXBYTEISALIGNED; + output RXBYTEREALIGN; + output RXCDRLOCK; + output RXCHANBONDSEQ; + output RXCHANISALIGNED; + output RXCHANREALIGN; + output RXCOMINITDET; + output RXCOMMADET; + output RXCOMSASDET; + output RXCOMWAKEDET; + output RXDATAVALID; + output RXDLYSRESETDONE; + output RXELECIDLE; + output RXHEADERVALID; + output RXOUTCLK; + output RXOUTCLKFABRIC; + output RXOUTCLKPCS; + output RXPHALIGNDONE; + output RXPRBSERR; + output RXQPISENN; + output RXQPISENP; + output RXRATEDONE; + output RXRESETDONE; + output RXSTARTOFSEQ; + output RXVALID; + output TXCOMFINISH; + output TXDLYSRESETDONE; + output TXGEARBOXREADY; + output TXOUTCLK; + output TXOUTCLKFABRIC; + output TXOUTCLKPCS; + output TXPHALIGNDONE; + output TXPHINITDONE; + output TXQPISENN; + output TXQPISENP; + output TXRATEDONE; + output TXRESETDONE; + output [15:0] DRPDO; + output [15:0] PCSRSVDOUT; + output [1:0] RXCLKCORCNT; + output [1:0] TXBUFSTATUS; + output [2:0] RXBUFSTATUS; + output [2:0] RXHEADER; + output [2:0] RXSTATUS; + output [4:0] RXCHBONDO; + output [4:0] RXPHMONITOR; + output [4:0] RXPHSLIPMONITOR; + output [63:0] RXDATA; + output [6:0] RXMONITOROUT; + output [7:0] DMONITOROUT; + output [7:0] RXCHARISCOMMA; + output [7:0] RXCHARISK; + output [7:0] RXDISPERR; + output [7:0] RXNOTINTABLE; + output [9:0] TSTOUT; + input CFGRESET; + input CPLLLOCKDETCLK; + input CPLLLOCKEN; + input CPLLPD; + input CPLLRESET; + input DRPCLK; + input DRPEN; + input DRPWE; + input EYESCANMODE; + input EYESCANRESET; + input EYESCANTRIGGER; + input GTGREFCLK; + input GTNORTHREFCLK0; + input GTNORTHREFCLK1; + input GTREFCLK0; + input GTREFCLK1; + input GTRESETSEL; + input GTRXRESET; + input GTSOUTHREFCLK0; + input GTSOUTHREFCLK1; + input GTTXRESET; + input GTXRXN; + input GTXRXP; + input QPLLCLK; + input QPLLREFCLK; + input RESETOVRD; + input RX8B10BEN; + input RXBUFRESET; + input RXCDRFREQRESET; + input RXCDRHOLD; + input RXCDROVRDEN; + input RXCDRRESET; + input RXCDRRESETRSV; + input RXCHBONDEN; + input RXCHBONDMASTER; + input RXCHBONDSLAVE; + input RXCOMMADETEN; + input RXDDIEN; + input RXDFEAGCHOLD; + input RXDFEAGCOVRDEN; + input RXDFECM1EN; + input RXDFELFHOLD; + input RXDFELFOVRDEN; + input RXDFELPMRESET; + input RXDFETAP2HOLD; + input RXDFETAP2OVRDEN; + input RXDFETAP3HOLD; + input RXDFETAP3OVRDEN; + input RXDFETAP4HOLD; + input RXDFETAP4OVRDEN; + input RXDFETAP5HOLD; + input RXDFETAP5OVRDEN; + input RXDFEUTHOLD; + input RXDFEUTOVRDEN; + input RXDFEVPHOLD; + input RXDFEVPOVRDEN; + input RXDFEVSEN; + input RXDFEXYDEN; + input RXDFEXYDHOLD; + input RXDFEXYDOVRDEN; + input RXDLYBYPASS; + input RXDLYEN; + input RXDLYOVRDEN; + input RXDLYSRESET; + input RXGEARBOXSLIP; + input RXLPMEN; + input RXLPMHFHOLD; + input RXLPMHFOVRDEN; + input RXLPMLFHOLD; + input RXLPMLFKLOVRDEN; + input RXMCOMMAALIGNEN; + input RXOOBRESET; + input RXOSHOLD; + input RXOSOVRDEN; + input RXPCOMMAALIGNEN; + input RXPCSRESET; + input RXPHALIGN; + input RXPHALIGNEN; + input RXPHDLYPD; + input RXPHDLYRESET; + input RXPHOVRDEN; + input RXPMARESET; + input RXPOLARITY; + input RXPRBSCNTRESET; + input RXQPIEN; + input RXSLIDE; + input RXUSERRDY; + input RXUSRCLK2; + input RXUSRCLK; + input SETERRSTATUS; + input TX8B10BEN; + input TXCOMINIT; + input TXCOMSAS; + input TXCOMWAKE; + input TXDEEMPH; + input TXDETECTRX; + input TXDIFFPD; + input TXDLYBYPASS; + input TXDLYEN; + input TXDLYHOLD; + input TXDLYOVRDEN; + input TXDLYSRESET; + input TXDLYUPDOWN; + input TXELECIDLE; + input TXINHIBIT; + input TXPCSRESET; + input TXPDELECIDLEMODE; + input TXPHALIGN; + input TXPHALIGNEN; + input TXPHDLYPD; + input TXPHDLYRESET; + input TXPHDLYTSTCLK; + input TXPHINIT; + input TXPHOVRDEN; + input TXPISOPD; + input TXPMARESET; + input TXPOLARITY; + input TXPOSTCURSORINV; + input TXPRBSFORCEERR; + input TXPRECURSORINV; + input TXQPIBIASEN; + input TXQPISTRONGPDOWN; + input TXQPIWEAKPUP; + input TXSTARTSEQ; + input TXSWING; + input TXUSERRDY; + input TXUSRCLK2; + input TXUSRCLK; + input [15:0] DRPDI; + input [15:0] GTRSVD; + input [15:0] PCSRSVDIN; + input [19:0] TSTIN; + input [1:0] RXELECIDLEMODE; + input [1:0] RXMONITORSEL; + input [1:0] RXPD; + input [1:0] RXSYSCLKSEL; + input [1:0] TXPD; + input [1:0] TXSYSCLKSEL; + input [2:0] CPLLREFCLKSEL; + input [2:0] LOOPBACK; + input [2:0] RXCHBONDLEVEL; + input [2:0] RXOUTCLKSEL; + input [2:0] RXPRBSSEL; + input [2:0] RXRATE; + input [2:0] TXBUFDIFFCTRL; + input [2:0] TXHEADER; + input [2:0] TXMARGIN; + input [2:0] TXOUTCLKSEL; + input [2:0] TXPRBSSEL; + input [2:0] TXRATE; + input [3:0] CLKRSVD; + input [3:0] TXDIFFCTRL; + input [4:0] PCSRSVDIN2; + input [4:0] PMARSVDIN2; + input [4:0] PMARSVDIN; + input [4:0] RXCHBONDI; + input [4:0] TXPOSTCURSOR; + input [4:0] TXPRECURSOR; + input [63:0] TXDATA; + input [6:0] TXMAINCURSOR; + input [6:0] TXSEQUENCE; + input [7:0] TX8B10BBYPASS; + input [7:0] TXCHARDISPMODE; + input [7:0] TXCHARDISPVAL; + input [7:0] TXCHARISK; + input [8:0] DRPADDR; +endmodule + +module GTXE2_COMMON (...); + parameter [63:0] BIAS_CFG = 64'h0000040000001000; + parameter [31:0] COMMON_CFG = 32'h00000000; + parameter [0:0] IS_DRPCLK_INVERTED = 1'b0; + parameter [0:0] IS_GTGREFCLK_INVERTED = 1'b0; + parameter [0:0] IS_QPLLLOCKDETCLK_INVERTED = 1'b0; + parameter [26:0] QPLL_CFG = 27'h0680181; + parameter [3:0] QPLL_CLKOUT_CFG = 4'b0000; + parameter [5:0] QPLL_COARSE_FREQ_OVRD = 6'b010000; + parameter [0:0] QPLL_COARSE_FREQ_OVRD_EN = 1'b0; + parameter [9:0] QPLL_CP = 10'b0000011111; + parameter [0:0] QPLL_CP_MONITOR_EN = 1'b0; + parameter [0:0] QPLL_DMONITOR_SEL = 1'b0; + parameter [9:0] QPLL_FBDIV = 10'b0000000000; + parameter [0:0] QPLL_FBDIV_MONITOR_EN = 1'b0; + parameter [0:0] QPLL_FBDIV_RATIO = 1'b0; + parameter [23:0] QPLL_INIT_CFG = 24'h000006; + parameter [15:0] QPLL_LOCK_CFG = 16'h21E8; + parameter [3:0] QPLL_LPF = 4'b1111; + parameter integer QPLL_REFCLK_DIV = 2; + parameter [2:0] SIM_QPLLREFCLK_SEL = 3'b001; + parameter SIM_RESET_SPEEDUP = "TRUE"; + parameter SIM_VERSION = "4.0"; + output DRPRDY; + output QPLLFBCLKLOST; + output QPLLLOCK; + output QPLLOUTCLK; + output QPLLOUTREFCLK; + output QPLLREFCLKLOST; + output REFCLKOUTMONITOR; + output [15:0] DRPDO; + output [7:0] QPLLDMONITOR; + input BGBYPASSB; + input BGMONITORENB; + input BGPDB; + input DRPCLK; + input DRPEN; + input DRPWE; + input GTGREFCLK; + input GTNORTHREFCLK0; + input GTNORTHREFCLK1; + input GTREFCLK0; + input GTREFCLK1; + input GTSOUTHREFCLK0; + input GTSOUTHREFCLK1; + input QPLLLOCKDETCLK; + input QPLLLOCKEN; + input QPLLOUTRESET; + input QPLLPD; + input QPLLRESET; + input RCALENB; + input [15:0] DRPDI; + input [15:0] QPLLRSVD1; + input [2:0] QPLLREFCLKSEL; + input [4:0] BGRCALOVRD; + input [4:0] QPLLRSVD2; + input [7:0] DRPADDR; + input [7:0] PMARSVD; +endmodule + +module IBUF_IBUFDISABLE (...); + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + input I; + input IBUFDISABLE; +endmodule + +module IBUF_INTERMDISABLE (...); + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + input I; + input IBUFDISABLE; + input INTERMDISABLE; +endmodule + +module IBUFDS (...); + parameter CAPACITANCE = "DONT_CARE"; + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_DELAY_VALUE = "0"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IFD_DELAY_VALUE = "AUTO"; + parameter IOSTANDARD = "DEFAULT"; + output O; + input I, IB; +endmodule + +module IBUFDS_DIFF_OUT (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + output O, OB; + input I, IB; +endmodule + +module IBUFDS_DIFF_OUT_IBUFDISABLE (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + output OB; + input I; + input IB; + input IBUFDISABLE; +endmodule + +module IBUFDS_DIFF_OUT_INTERMDISABLE (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + output OB; + input I; + input IB; + input IBUFDISABLE; + input INTERMDISABLE; +endmodule + +module IBUFDS_GTE2 (...); + parameter CLKCM_CFG = "TRUE"; + parameter CLKRCV_TRST = "TRUE"; + parameter CLKSWING_CFG = "TRUE"; + output O; + output ODIV2; + input CEB; + input I; + input IB; +endmodule + +module IBUFDS_IBUFDISABLE (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + input I; + input IB; + input IBUFDISABLE; +endmodule + +module IBUFDS_INTERMDISABLE (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + input I; + input IB; + input IBUFDISABLE; + input INTERMDISABLE; +endmodule + +module ICAPE2 (...); + parameter [31:0] DEVICE_ID = 32'h04244093; + parameter ICAP_WIDTH = "X32"; + parameter SIM_CFG_FILE_NAME = "NONE"; + output [31:0] O; + input CLK; + input CSIB; + input RDWRB; + input [31:0] I; +endmodule + +module IDDR (...); + parameter DDR_CLK_EDGE = "OPPOSITE_EDGE"; + parameter INIT_Q1 = 1'b0; + parameter INIT_Q2 = 1'b0; + parameter [0:0] IS_C_INVERTED = 1'b0; + parameter [0:0] IS_D_INVERTED = 1'b0; + parameter SRTYPE = "SYNC"; + parameter MSGON = "TRUE"; + parameter XON = "TRUE"; + output Q1; + output Q2; + input C; + input CE; + input D; + input R; + input S; +endmodule + +module IDDR_2CLK (...); + parameter DDR_CLK_EDGE = "OPPOSITE_EDGE"; + parameter INIT_Q1 = 1'b0; + parameter INIT_Q2 = 1'b0; + parameter [0:0] IS_CB_INVERTED = 1'b0; + parameter [0:0] IS_C_INVERTED = 1'b0; + parameter [0:0] IS_D_INVERTED = 1'b0; + parameter SRTYPE = "SYNC"; + output Q1; + output Q2; + input C; + input CB; + input CE; + input D; + input R; + input S; +endmodule + +module IDELAYCTRL (...); + parameter SIM_DEVICE = "7SERIES"; + output RDY; + input REFCLK; + input RST; +endmodule + +module IDELAYE2 (...); + parameter CINVCTRL_SEL = "FALSE"; + parameter DELAY_SRC = "IDATAIN"; + parameter HIGH_PERFORMANCE_MODE = "FALSE"; + parameter IDELAY_TYPE = "FIXED"; + parameter integer IDELAY_VALUE = 0; + parameter [0:0] IS_C_INVERTED = 1'b0; + parameter [0:0] IS_DATAIN_INVERTED = 1'b0; + parameter [0:0] IS_IDATAIN_INVERTED = 1'b0; + parameter PIPE_SEL = "FALSE"; + parameter real REFCLK_FREQUENCY = 200.0; + parameter SIGNAL_PATTERN = "DATA"; + parameter integer SIM_DELAY_D = 0; + output [4:0] CNTVALUEOUT; + output DATAOUT; + input C; + input CE; + input CINVCTRL; + input [4:0] CNTVALUEIN; + input DATAIN; + input IDATAIN; + input INC; + input LD; + input LDPIPEEN; + input REGRST; +endmodule + +module IN_FIFO (...); + parameter integer ALMOST_EMPTY_VALUE = 1; + parameter integer ALMOST_FULL_VALUE = 1; + parameter ARRAY_MODE = "ARRAY_MODE_4_X_8"; + parameter SYNCHRONOUS_MODE = "FALSE"; + output ALMOSTEMPTY; + output ALMOSTFULL; + output EMPTY; + output FULL; + output [7:0] Q0; + output [7:0] Q1; + output [7:0] Q2; + output [7:0] Q3; + output [7:0] Q4; + output [7:0] Q5; + output [7:0] Q6; + output [7:0] Q7; + output [7:0] Q8; + output [7:0] Q9; + input RDCLK; + input RDEN; + input RESET; + input WRCLK; + input WREN; + input [3:0] D0; + input [3:0] D1; + input [3:0] D2; + input [3:0] D3; + input [3:0] D4; + input [3:0] D7; + input [3:0] D8; + input [3:0] D9; + input [7:0] D5; + input [7:0] D6; +endmodule + +module IOBUF (...); + parameter integer DRIVE = 12; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SLEW = "SLOW"; + output O; + input I, T; +endmodule + +module IOBUF_DCIEN (...); + parameter integer DRIVE = 12; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter SLEW = "SLOW"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + input DCITERMDISABLE; + input I; + input IBUFDISABLE; + input T; +endmodule + +module IOBUF_INTERMDISABLE (...); + parameter integer DRIVE = 12; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter SLEW = "SLOW"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + input I; + input IBUFDISABLE; + input INTERMDISABLE; + input T; +endmodule + +module IOBUFDS (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SLEW = "SLOW"; + output O; + input I, T; +endmodule + +module IOBUFDS_DCIEN (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter SLEW = "SLOW"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + input DCITERMDISABLE; + input I; + input IBUFDISABLE; + input T; +endmodule + +module IOBUFDS_DIFF_OUT (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + output O; + output OB; + input I; + input TM; + input TS; +endmodule + +module IOBUFDS_DIFF_OUT_DCIEN (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + output OB; + input DCITERMDISABLE; + input I; + input IBUFDISABLE; + input TM; + input TS; +endmodule + +module IOBUFDS_DIFF_OUT_INTERMDISABLE (...); + parameter DIFF_TERM = "FALSE"; + parameter DQS_BIAS = "FALSE"; + parameter IBUF_LOW_PWR = "TRUE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SIM_DEVICE = "7SERIES"; + parameter USE_IBUFDISABLE = "TRUE"; + output O; + output OB; + input I; + input IBUFDISABLE; + input INTERMDISABLE; + input TM; + input TS; +endmodule + +module ISERDESE2 (...); + parameter DATA_RATE = "DDR"; + parameter integer DATA_WIDTH = 4; + parameter DYN_CLKDIV_INV_EN = "FALSE"; + parameter DYN_CLK_INV_EN = "FALSE"; + parameter [0:0] INIT_Q1 = 1'b0; + parameter [0:0] INIT_Q2 = 1'b0; + parameter [0:0] INIT_Q3 = 1'b0; + parameter [0:0] INIT_Q4 = 1'b0; + parameter INTERFACE_TYPE = "MEMORY"; + parameter IOBDELAY = "NONE"; + parameter [0:0] IS_CLKB_INVERTED = 1'b0; + parameter [0:0] IS_CLKDIVP_INVERTED = 1'b0; + parameter [0:0] IS_CLKDIV_INVERTED = 1'b0; + parameter [0:0] IS_CLK_INVERTED = 1'b0; + parameter [0:0] IS_D_INVERTED = 1'b0; + parameter [0:0] IS_OCLKB_INVERTED = 1'b0; + parameter [0:0] IS_OCLK_INVERTED = 1'b0; + parameter integer NUM_CE = 2; + parameter OFB_USED = "FALSE"; + parameter SERDES_MODE = "MASTER"; + parameter [0:0] SRVAL_Q1 = 1'b0; + parameter [0:0] SRVAL_Q2 = 1'b0; + parameter [0:0] SRVAL_Q3 = 1'b0; + parameter [0:0] SRVAL_Q4 = 1'b0; + output O; + output Q1; + output Q2; + output Q3; + output Q4; + output Q5; + output Q6; + output Q7; + output Q8; + output SHIFTOUT1; + output SHIFTOUT2; + input BITSLIP; + input CE1; + input CE2; + input CLK; + input CLKB; + input CLKDIV; + input CLKDIVP; + input D; + input DDLY; + input DYNCLKDIVSEL; + input DYNCLKSEL; + input OCLK; + input OCLKB; + input OFB; + input RST; + input SHIFTIN1; + input SHIFTIN2; +endmodule + +module KEEPER (...); +endmodule + +module LDCE (...); + parameter [0:0] INIT = 1'b0; + parameter [0:0] IS_CLR_INVERTED = 1'b0; + parameter [0:0] IS_G_INVERTED = 1'b0; + parameter MSGON = "TRUE"; + parameter XON = "TRUE"; + output Q; + input CLR, D, G, GE; +endmodule + +module LDPE (...); + parameter [0:0] INIT = 1'b1; + parameter [0:0] IS_G_INVERTED = 1'b0; + parameter [0:0] IS_PRE_INVERTED = 1'b0; + parameter MSGON = "TRUE"; + parameter XON = "TRUE"; + output Q; + input D, G, GE, PRE; +endmodule + +module LUT6_2 (...); + parameter [63:0] INIT = 64'h0000000000000000; + input I0, I1, I2, I3, I4, I5; + output O5, O6; +endmodule + +module MMCME2_ADV (...); + parameter BANDWIDTH = "OPTIMIZED"; + parameter real CLKFBOUT_MULT_F = 5.000; + parameter real CLKFBOUT_PHASE = 0.000; + parameter CLKFBOUT_USE_FINE_PS = "FALSE"; + parameter real CLKIN1_PERIOD = 0.000; + parameter real CLKIN2_PERIOD = 0.000; + parameter real CLKIN_FREQ_MAX = 1066.000; + parameter real CLKIN_FREQ_MIN = 10.000; + parameter real CLKOUT0_DIVIDE_F = 1.000; + parameter real CLKOUT0_DUTY_CYCLE = 0.500; + parameter real CLKOUT0_PHASE = 0.000; + parameter CLKOUT0_USE_FINE_PS = "FALSE"; + parameter integer CLKOUT1_DIVIDE = 1; + parameter real CLKOUT1_DUTY_CYCLE = 0.500; + parameter real CLKOUT1_PHASE = 0.000; + parameter CLKOUT1_USE_FINE_PS = "FALSE"; + parameter integer CLKOUT2_DIVIDE = 1; + parameter real CLKOUT2_DUTY_CYCLE = 0.500; + parameter real CLKOUT2_PHASE = 0.000; + parameter CLKOUT2_USE_FINE_PS = "FALSE"; + parameter integer CLKOUT3_DIVIDE = 1; + parameter real CLKOUT3_DUTY_CYCLE = 0.500; + parameter real CLKOUT3_PHASE = 0.000; + parameter CLKOUT3_USE_FINE_PS = "FALSE"; + parameter CLKOUT4_CASCADE = "FALSE"; + parameter integer CLKOUT4_DIVIDE = 1; + parameter real CLKOUT4_DUTY_CYCLE = 0.500; + parameter real CLKOUT4_PHASE = 0.000; + parameter CLKOUT4_USE_FINE_PS = "FALSE"; + parameter integer CLKOUT5_DIVIDE = 1; + parameter real CLKOUT5_DUTY_CYCLE = 0.500; + parameter real CLKOUT5_PHASE = 0.000; + parameter CLKOUT5_USE_FINE_PS = "FALSE"; + parameter integer CLKOUT6_DIVIDE = 1; + parameter real CLKOUT6_DUTY_CYCLE = 0.500; + parameter real CLKOUT6_PHASE = 0.000; + parameter CLKOUT6_USE_FINE_PS = "FALSE"; + parameter real CLKPFD_FREQ_MAX = 550.000; + parameter real CLKPFD_FREQ_MIN = 10.000; + parameter COMPENSATION = "ZHOLD"; + parameter integer DIVCLK_DIVIDE = 1; + parameter [0:0] IS_CLKINSEL_INVERTED = 1'b0; + parameter [0:0] IS_PSEN_INVERTED = 1'b0; + parameter [0:0] IS_PSINCDEC_INVERTED = 1'b0; + parameter [0:0] IS_PWRDWN_INVERTED = 1'b0; + parameter [0:0] IS_RST_INVERTED = 1'b0; + parameter real REF_JITTER1 = 0.010; + parameter real REF_JITTER2 = 0.010; + parameter SS_EN = "FALSE"; + parameter SS_MODE = "CENTER_HIGH"; + parameter integer SS_MOD_PERIOD = 10000; + parameter STARTUP_WAIT = "FALSE"; + parameter real VCOCLK_FREQ_MAX = 1600.000; + parameter real VCOCLK_FREQ_MIN = 600.000; + parameter STARTUP_WAIT = "FALSE"; + output CLKFBOUT; + output CLKFBOUTB; + output CLKFBSTOPPED; + output CLKINSTOPPED; + output CLKOUT0; + output CLKOUT0B; + output CLKOUT1; + output CLKOUT1B; + output CLKOUT2; + output CLKOUT2B; + output CLKOUT3; + output CLKOUT3B; + output CLKOUT4; + output CLKOUT5; + output CLKOUT6; + output [15:0] DO; + output DRDY; + output LOCKED; + output PSDONE; + input CLKFBIN; + input CLKIN1; + input CLKIN2; + input CLKINSEL; + input [6:0] DADDR; + input DCLK; + input DEN; + input [15:0] DI; + input DWE; + input PSCLK; + input PSEN; + input PSINCDEC; + input PWRDWN; + input RST; +endmodule + +module MMCME2_BASE (...); + parameter BANDWIDTH = "OPTIMIZED"; + parameter real CLKFBOUT_MULT_F = 5.000; + parameter real CLKFBOUT_PHASE = 0.000; + parameter real CLKIN1_PERIOD = 0.000; + parameter real CLKOUT0_DIVIDE_F = 1.000; + parameter real CLKOUT0_DUTY_CYCLE = 0.500; + parameter real CLKOUT0_PHASE = 0.000; + parameter integer CLKOUT1_DIVIDE = 1; + parameter real CLKOUT1_DUTY_CYCLE = 0.500; + parameter real CLKOUT1_PHASE = 0.000; + parameter integer CLKOUT2_DIVIDE = 1; + parameter real CLKOUT2_DUTY_CYCLE = 0.500; + parameter real CLKOUT2_PHASE = 0.000; + parameter integer CLKOUT3_DIVIDE = 1; + parameter real CLKOUT3_DUTY_CYCLE = 0.500; + parameter real CLKOUT3_PHASE = 0.000; + parameter CLKOUT4_CASCADE = "FALSE"; + parameter integer CLKOUT4_DIVIDE = 1; + parameter real CLKOUT4_DUTY_CYCLE = 0.500; + parameter real CLKOUT4_PHASE = 0.000; + parameter integer CLKOUT5_DIVIDE = 1; + parameter real CLKOUT5_DUTY_CYCLE = 0.500; + parameter real CLKOUT5_PHASE = 0.000; + parameter integer CLKOUT6_DIVIDE = 1; + parameter real CLKOUT6_DUTY_CYCLE = 0.500; + parameter real CLKOUT6_PHASE = 0.000; + parameter integer DIVCLK_DIVIDE = 1; + parameter real REF_JITTER1 = 0.010; + parameter STARTUP_WAIT = "FALSE"; + output CLKFBOUT; + output CLKFBOUTB; + output CLKOUT0; + output CLKOUT0B; + output CLKOUT1; + output CLKOUT1B; + output CLKOUT2; + output CLKOUT2B; + output CLKOUT3; + output CLKOUT3B; + output CLKOUT4; + output CLKOUT5; + output CLKOUT6; + output LOCKED; + input CLKFBIN; + input CLKIN1; + input PWRDWN; + input RST; +endmodule + +module OBUFDS (...); + parameter CAPACITANCE = "DONT_CARE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SLEW = "SLOW"; + output O, OB; + input I; +endmodule + +module OBUFT (...); + parameter CAPACITANCE = "DONT_CARE"; + parameter integer DRIVE = 12; + parameter IOSTANDARD = "DEFAULT"; + parameter SLEW = "SLOW"; + output O; + input I, T; +endmodule + +module OBUFTDS (...); + parameter CAPACITANCE = "DONT_CARE"; + parameter IOSTANDARD = "DEFAULT"; + parameter SLEW = "SLOW"; + output O, OB; + input I, T; +endmodule + +module ODDR (...); + output Q; + input C; + input CE; + input D1; + input D2; + input R; + input S; + parameter DDR_CLK_EDGE = "OPPOSITE_EDGE"; + parameter INIT = 1'b0; + parameter [0:0] IS_C_INVERTED = 1'b0; + parameter [0:0] IS_D1_INVERTED = 1'b0; + parameter [0:0] IS_D2_INVERTED = 1'b0; + parameter SRTYPE = "SYNC"; + parameter MSGON = "TRUE"; + parameter XON = "TRUE"; +endmodule + +module ODELAYE2 (...); + parameter CINVCTRL_SEL = "FALSE"; + parameter DELAY_SRC = "ODATAIN"; + parameter HIGH_PERFORMANCE_MODE = "FALSE"; + parameter [0:0] IS_C_INVERTED = 1'b0; + parameter [0:0] IS_ODATAIN_INVERTED = 1'b0; + parameter ODELAY_TYPE = "FIXED"; + parameter integer ODELAY_VALUE = 0; + parameter PIPE_SEL = "FALSE"; + parameter real REFCLK_FREQUENCY = 200.0; + parameter SIGNAL_PATTERN = "DATA"; + parameter integer SIM_DELAY_D = 0; + output [4:0] CNTVALUEOUT; + output DATAOUT; + input C; + input CE; + input CINVCTRL; + input CLKIN; + input [4:0] CNTVALUEIN; + input INC; + input LD; + input LDPIPEEN; + input ODATAIN; + input REGRST; +endmodule + +module OSERDESE2 (...); + parameter DATA_RATE_OQ = "DDR"; + parameter DATA_RATE_TQ = "DDR"; + parameter integer DATA_WIDTH = 4; + parameter [0:0] INIT_OQ = 1'b0; + parameter [0:0] INIT_TQ = 1'b0; + parameter [0:0] IS_CLKDIV_INVERTED = 1'b0; + parameter [0:0] IS_CLK_INVERTED = 1'b0; + parameter [0:0] IS_D1_INVERTED = 1'b0; + parameter [0:0] IS_D2_INVERTED = 1'b0; + parameter [0:0] IS_D3_INVERTED = 1'b0; + parameter [0:0] IS_D4_INVERTED = 1'b0; + parameter [0:0] IS_D5_INVERTED = 1'b0; + parameter [0:0] IS_D6_INVERTED = 1'b0; + parameter [0:0] IS_D7_INVERTED = 1'b0; + parameter [0:0] IS_D8_INVERTED = 1'b0; + parameter [0:0] IS_T1_INVERTED = 1'b0; + parameter [0:0] IS_T2_INVERTED = 1'b0; + parameter [0:0] IS_T3_INVERTED = 1'b0; + parameter [0:0] IS_T4_INVERTED = 1'b0; + parameter SERDES_MODE = "MASTER"; + parameter [0:0] SRVAL_OQ = 1'b0; + parameter [0:0] SRVAL_TQ = 1'b0; + parameter TBYTE_CTL = "FALSE"; + parameter TBYTE_SRC = "FALSE"; + parameter integer TRISTATE_WIDTH = 4; + output OFB; + output OQ; + output SHIFTOUT1; + output SHIFTOUT2; + output TBYTEOUT; + output TFB; + output TQ; + input CLK; + input CLKDIV; + input D1; + input D2; + input D3; + input D4; + input D5; + input D6; + input D7; + input D8; + input OCE; + input RST; + input SHIFTIN1; + input SHIFTIN2; + input T1; + input T2; + input T3; + input T4; + input TBYTEIN; + input TCE; +endmodule + +module OUT_FIFO (...); + parameter integer ALMOST_EMPTY_VALUE = 1; + parameter integer ALMOST_FULL_VALUE = 1; + parameter ARRAY_MODE = "ARRAY_MODE_8_X_4"; + parameter OUTPUT_DISABLE = "FALSE"; + parameter SYNCHRONOUS_MODE = "FALSE"; + output ALMOSTEMPTY; + output ALMOSTFULL; + output EMPTY; + output FULL; + output [3:0] Q0; + output [3:0] Q1; + output [3:0] Q2; + output [3:0] Q3; + output [3:0] Q4; + output [3:0] Q7; + output [3:0] Q8; + output [3:0] Q9; + output [7:0] Q5; + output [7:0] Q6; + input RDCLK; + input RDEN; + input RESET; + input WRCLK; + input WREN; + input [7:0] D0; + input [7:0] D1; + input [7:0] D2; + input [7:0] D3; + input [7:0] D4; + input [7:0] D5; + input [7:0] D6; + input [7:0] D7; + input [7:0] D8; + input [7:0] D9; +endmodule + +module PHASER_IN (...); + parameter integer CLKOUT_DIV = 4; + parameter DQS_BIAS_MODE = "FALSE"; + parameter EN_ISERDES_RST = "FALSE"; + parameter integer FINE_DELAY = 0; + parameter FREQ_REF_DIV = "NONE"; + parameter [0:0] IS_RST_INVERTED = 1'b0; + parameter real MEMREFCLK_PERIOD = 0.000; + parameter OUTPUT_CLK_SRC = "PHASE_REF"; + parameter real PHASEREFCLK_PERIOD = 0.000; + parameter real REFCLK_PERIOD = 0.000; + parameter integer SEL_CLK_OFFSET = 5; + parameter SYNC_IN_DIV_RST = "FALSE"; + output FINEOVERFLOW; + output ICLK; + output ICLKDIV; + output ISERDESRST; + output RCLK; + output [5:0] COUNTERREADVAL; + input COUNTERLOADEN; + input COUNTERREADEN; + input DIVIDERST; + input EDGEADV; + input FINEENABLE; + input FINEINC; + input FREQREFCLK; + input MEMREFCLK; + input PHASEREFCLK; + input RST; + input SYNCIN; + input SYSCLK; + input [1:0] RANKSEL; + input [5:0] COUNTERLOADVAL; +endmodule + +module PHASER_IN_PHY (...); + parameter BURST_MODE = "FALSE"; + parameter integer CLKOUT_DIV = 4; + parameter [0:0] DQS_AUTO_RECAL = 1'b1; + parameter DQS_BIAS_MODE = "FALSE"; + parameter [2:0] DQS_FIND_PATTERN = 3'b001; + parameter integer FINE_DELAY = 0; + parameter FREQ_REF_DIV = "NONE"; + parameter [0:0] IS_RST_INVERTED = 1'b0; + parameter real MEMREFCLK_PERIOD = 0.000; + parameter OUTPUT_CLK_SRC = "PHASE_REF"; + parameter real PHASEREFCLK_PERIOD = 0.000; + parameter real REFCLK_PERIOD = 0.000; + parameter integer SEL_CLK_OFFSET = 5; + parameter SYNC_IN_DIV_RST = "FALSE"; + parameter WR_CYCLES = "FALSE"; + output DQSFOUND; + output DQSOUTOFRANGE; + output FINEOVERFLOW; + output ICLK; + output ICLKDIV; + output ISERDESRST; + output PHASELOCKED; + output RCLK; + output WRENABLE; + output [5:0] COUNTERREADVAL; + input BURSTPENDINGPHY; + input COUNTERLOADEN; + input COUNTERREADEN; + input FINEENABLE; + input FINEINC; + input FREQREFCLK; + input MEMREFCLK; + input PHASEREFCLK; + input RST; + input RSTDQSFIND; + input SYNCIN; + input SYSCLK; + input [1:0] ENCALIBPHY; + input [1:0] RANKSELPHY; + input [5:0] COUNTERLOADVAL; +endmodule + +module PHASER_OUT (...); + parameter integer CLKOUT_DIV = 4; + parameter COARSE_BYPASS = "FALSE"; + parameter integer COARSE_DELAY = 0; + parameter EN_OSERDES_RST = "FALSE"; + parameter integer FINE_DELAY = 0; + parameter [0:0] IS_RST_INVERTED = 1'b0; + parameter real MEMREFCLK_PERIOD = 0.000; + parameter OCLKDELAY_INV = "FALSE"; + parameter integer OCLK_DELAY = 0; + parameter OUTPUT_CLK_SRC = "PHASE_REF"; + parameter real PHASEREFCLK_PERIOD = 0.000; + parameter [2:0] PO = 3'b000; + parameter real REFCLK_PERIOD = 0.000; + parameter SYNC_IN_DIV_RST = "FALSE"; + output COARSEOVERFLOW; + output FINEOVERFLOW; + output OCLK; + output OCLKDELAYED; + output OCLKDIV; + output OSERDESRST; + output [8:0] COUNTERREADVAL; + input COARSEENABLE; + input COARSEINC; + input COUNTERLOADEN; + input COUNTERREADEN; + input DIVIDERST; + input EDGEADV; + input FINEENABLE; + input FINEINC; + input FREQREFCLK; + input MEMREFCLK; + input PHASEREFCLK; + input RST; + input SELFINEOCLKDELAY; + input SYNCIN; + input SYSCLK; + input [8:0] COUNTERLOADVAL; +endmodule + +module PHASER_OUT_PHY (...); + parameter integer CLKOUT_DIV = 4; + parameter COARSE_BYPASS = "FALSE"; + parameter integer COARSE_DELAY = 0; + parameter DATA_CTL_N = "FALSE"; + parameter DATA_RD_CYCLES = "FALSE"; + parameter integer FINE_DELAY = 0; + parameter [0:0] IS_RST_INVERTED = 1'b0; + parameter real MEMREFCLK_PERIOD = 0.000; + parameter OCLKDELAY_INV = "FALSE"; + parameter integer OCLK_DELAY = 0; + parameter OUTPUT_CLK_SRC = "PHASE_REF"; + parameter real PHASEREFCLK_PERIOD = 0.000; + parameter [2:0] PO = 3'b000; + parameter real REFCLK_PERIOD = 0.000; + parameter SYNC_IN_DIV_RST = "FALSE"; + output COARSEOVERFLOW; + output FINEOVERFLOW; + output OCLK; + output OCLKDELAYED; + output OCLKDIV; + output OSERDESRST; + output RDENABLE; + output [1:0] CTSBUS; + output [1:0] DQSBUS; + output [1:0] DTSBUS; + output [8:0] COUNTERREADVAL; + input BURSTPENDINGPHY; + input COARSEENABLE; + input COARSEINC; + input COUNTERLOADEN; + input COUNTERREADEN; + input FINEENABLE; + input FINEINC; + input FREQREFCLK; + input MEMREFCLK; + input PHASEREFCLK; + input RST; + input SELFINEOCLKDELAY; + input SYNCIN; + input SYSCLK; + input [1:0] ENCALIBPHY; + input [8:0] COUNTERLOADVAL; +endmodule + +module PHASER_REF (...); + parameter [0:0] IS_RST_INVERTED = 1'b0; + parameter [0:0] IS_PWRDWN_INVERTED = 1'b0; + output LOCKED; + input CLKIN; + input PWRDWN; + input RST; +endmodule + +module PHY_CONTROL (...); + parameter integer AO_TOGGLE = 0; + parameter [3:0] AO_WRLVL_EN = 4'b0000; + parameter BURST_MODE = "FALSE"; + parameter integer CLK_RATIO = 1; + parameter integer CMD_OFFSET = 0; + parameter integer CO_DURATION = 0; + parameter DATA_CTL_A_N = "FALSE"; + parameter DATA_CTL_B_N = "FALSE"; + parameter DATA_CTL_C_N = "FALSE"; + parameter DATA_CTL_D_N = "FALSE"; + parameter DISABLE_SEQ_MATCH = "TRUE"; + parameter integer DI_DURATION = 0; + parameter integer DO_DURATION = 0; + parameter integer EVENTS_DELAY = 63; + parameter integer FOUR_WINDOW_CLOCKS = 63; + parameter MULTI_REGION = "FALSE"; + parameter PHY_COUNT_ENABLE = "FALSE"; + parameter integer RD_CMD_OFFSET_0 = 0; + parameter integer RD_CMD_OFFSET_1 = 00; + parameter integer RD_CMD_OFFSET_2 = 0; + parameter integer RD_CMD_OFFSET_3 = 0; + parameter integer RD_DURATION_0 = 0; + parameter integer RD_DURATION_1 = 0; + parameter integer RD_DURATION_2 = 0; + parameter integer RD_DURATION_3 = 0; + parameter SYNC_MODE = "FALSE"; + parameter integer WR_CMD_OFFSET_0 = 0; + parameter integer WR_CMD_OFFSET_1 = 0; + parameter integer WR_CMD_OFFSET_2 = 0; + parameter integer WR_CMD_OFFSET_3 = 0; + parameter integer WR_DURATION_0 = 0; + parameter integer WR_DURATION_1 = 0; + parameter integer WR_DURATION_2 = 0; + parameter integer WR_DURATION_3 = 0; + output PHYCTLALMOSTFULL; + output PHYCTLEMPTY; + output PHYCTLFULL; + output PHYCTLREADY; + output [1:0] INRANKA; + output [1:0] INRANKB; + output [1:0] INRANKC; + output [1:0] INRANKD; + output [1:0] PCENABLECALIB; + output [3:0] AUXOUTPUT; + output [3:0] INBURSTPENDING; + output [3:0] OUTBURSTPENDING; + input MEMREFCLK; + input PHYCLK; + input PHYCTLMSTREMPTY; + input PHYCTLWRENABLE; + input PLLLOCK; + input READCALIBENABLE; + input REFDLLLOCK; + input RESET; + input SYNCIN; + input WRITECALIBENABLE; + input [31:0] PHYCTLWD; +endmodule + +module PLLE2_ADV (...); + parameter BANDWIDTH = "OPTIMIZED"; + parameter COMPENSATION = "ZHOLD"; + parameter STARTUP_WAIT = "FALSE"; + parameter integer CLKOUT0_DIVIDE = 1; + parameter integer CLKOUT1_DIVIDE = 1; + parameter integer CLKOUT2_DIVIDE = 1; + parameter integer CLKOUT3_DIVIDE = 1; + parameter integer CLKOUT4_DIVIDE = 1; + parameter integer CLKOUT5_DIVIDE = 1; + parameter integer DIVCLK_DIVIDE = 1; + parameter integer CLKFBOUT_MULT = 5; + parameter real CLKFBOUT_PHASE = 0.000; + parameter real CLKIN1_PERIOD = 0.000; + parameter real CLKIN2_PERIOD = 0.000; + parameter real CLKOUT0_DUTY_CYCLE = 0.500; + parameter real CLKOUT0_PHASE = 0.000; + parameter real CLKOUT1_DUTY_CYCLE = 0.500; + parameter real CLKOUT1_PHASE = 0.000; + parameter real CLKOUT2_DUTY_CYCLE = 0.500; + parameter real CLKOUT2_PHASE = 0.000; + parameter real CLKOUT3_DUTY_CYCLE = 0.500; + parameter real CLKOUT3_PHASE = 0.000; + parameter real CLKOUT4_DUTY_CYCLE = 0.500; + parameter real CLKOUT4_PHASE = 0.000; + parameter real CLKOUT5_DUTY_CYCLE = 0.500; + parameter real CLKOUT5_PHASE = 0.000; + parameter [0:0] IS_CLKINSEL_INVERTED = 1'b0; + parameter [0:0] IS_PWRDWN_INVERTED = 1'b0; + parameter [0:0] IS_RST_INVERTED = 1'b0; + parameter real REF_JITTER1 = 0.010; + parameter real REF_JITTER2 = 0.010; + parameter real VCOCLK_FREQ_MAX = 2133.000; + parameter real VCOCLK_FREQ_MIN = 800.000; + parameter real CLKIN_FREQ_MAX = 1066.000; + parameter real CLKIN_FREQ_MIN = 19.000; + parameter real CLKPFD_FREQ_MAX = 550.0; + parameter real CLKPFD_FREQ_MIN = 19.0; + output CLKFBOUT; + output CLKOUT0; + output CLKOUT1; + output CLKOUT2; + output CLKOUT3; + output CLKOUT4; + output CLKOUT5; + output DRDY; + output LOCKED; + output [15:0] DO; + input CLKFBIN; + input CLKIN1; + input CLKIN2; + input CLKINSEL; + input DCLK; + input DEN; + input DWE; + input PWRDWN; + input RST; + input [15:0] DI; + input [6:0] DADDR; +endmodule + +module PLLE2_BASE (...); + parameter BANDWIDTH = "OPTIMIZED"; + parameter integer CLKFBOUT_MULT = 5; + parameter real CLKFBOUT_PHASE = 0.000; + parameter real CLKIN1_PERIOD = 0.000; + parameter integer CLKOUT0_DIVIDE = 1; + parameter real CLKOUT0_DUTY_CYCLE = 0.500; + parameter real CLKOUT0_PHASE = 0.000; + parameter integer CLKOUT1_DIVIDE = 1; + parameter real CLKOUT1_DUTY_CYCLE = 0.500; + parameter real CLKOUT1_PHASE = 0.000; + parameter integer CLKOUT2_DIVIDE = 1; + parameter real CLKOUT2_DUTY_CYCLE = 0.500; + parameter real CLKOUT2_PHASE = 0.000; + parameter integer CLKOUT3_DIVIDE = 1; + parameter real CLKOUT3_DUTY_CYCLE = 0.500; + parameter real CLKOUT3_PHASE = 0.000; + parameter integer CLKOUT4_DIVIDE = 1; + parameter real CLKOUT4_DUTY_CYCLE = 0.500; + parameter real CLKOUT4_PHASE = 0.000; + parameter integer CLKOUT5_DIVIDE = 1; + parameter real CLKOUT5_DUTY_CYCLE = 0.500; + parameter real CLKOUT5_PHASE = 0.000; + parameter integer DIVCLK_DIVIDE = 1; + parameter real REF_JITTER1 = 0.010; + parameter STARTUP_WAIT = "FALSE"; + output CLKFBOUT; + output CLKOUT0; + output CLKOUT1; + output CLKOUT2; + output CLKOUT3; + output CLKOUT4; + output CLKOUT5; + output LOCKED; + input CLKFBIN; + input CLKIN1; + input PWRDWN; + input RST; +endmodule + +module PULLDOWN (...); + output O; +endmodule + +module PULLUP (...); + output O; +endmodule + +module RAM128X1S (...); + parameter [127:0] INIT = 128'h00000000000000000000000000000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output O; + input A0, A1, A2, A3, A4, A5, A6, D, WCLK, WE; +endmodule + +module RAM256X1S (...); + parameter [255:0] INIT = 256'h0; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output O; + input [7:0] A; + input D; + input WCLK; + input WE; +endmodule + +module RAM32M (...); + parameter [63:0] INIT_A = 64'h0000000000000000; + parameter [63:0] INIT_B = 64'h0000000000000000; + parameter [63:0] INIT_C = 64'h0000000000000000; + parameter [63:0] INIT_D = 64'h0000000000000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output [1:0] DOA; + output [1:0] DOB; + output [1:0] DOC; + output [1:0] DOD; + input [4:0] ADDRA; + input [4:0] ADDRB; + input [4:0] ADDRC; + input [4:0] ADDRD; + input [1:0] DIA; + input [1:0] DIB; + input [1:0] DIC; + input [1:0] DID; + input WCLK; + input WE; +endmodule + +module RAM32X1D (...); + parameter [31:0] INIT = 32'h00000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output DPO, SPO; + input A0, A1, A2, A3, A4, D, DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, WCLK, WE; +endmodule + +module RAM32X1S (...); + parameter [31:0] INIT = 32'h00000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output O; + input A0, A1, A2, A3, A4, D, WCLK, WE; +endmodule + +module RAM32X1S_1 (...); + parameter [31:0] INIT = 32'h00000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output O; + input A0, A1, A2, A3, A4, D, WCLK, WE; +endmodule + +module RAM32X2S (...); + parameter [31:0] INIT_00 = 32'h00000000; + parameter [31:0] INIT_01 = 32'h00000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output O0, O1; + input A0, A1, A2, A3, A4, D0, D1, WCLK, WE; +endmodule + +module RAM64M (...); + parameter [63:0] INIT_A = 64'h0000000000000000; + parameter [63:0] INIT_B = 64'h0000000000000000; + parameter [63:0] INIT_C = 64'h0000000000000000; + parameter [63:0] INIT_D = 64'h0000000000000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output DOA; + output DOB; + output DOC; + output DOD; + input [5:0] ADDRA; + input [5:0] ADDRB; + input [5:0] ADDRC; + input [5:0] ADDRD; + input DIA; + input DIB; + input DIC; + input DID; + input WCLK; + input WE; +endmodule + +module RAM64X1S (...); + parameter [63:0] INIT = 64'h0000000000000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output O; + input A0, A1, A2, A3, A4, A5, D, WCLK, WE; +endmodule + +module RAM64X1S_1 (...); + parameter [63:0] INIT = 64'h0000000000000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output O; + input A0, A1, A2, A3, A4, A5, D, WCLK, WE; +endmodule + +module RAM64X2S (...); + parameter [63:0] INIT_00 = 64'h0000000000000000; + parameter [63:0] INIT_01 = 64'h0000000000000000; + parameter [0:0] IS_WCLK_INVERTED = 1'b0; + output O0, O1; + input A0, A1, A2, A3, A4, A5, D0, D1, WCLK, WE; +endmodule + +module ROM128X1 (...); + parameter [127:0] INIT = 128'h00000000000000000000000000000000; + output O; + input A0, A1, A2, A3, A4, A5, A6; +endmodule + +module ROM256X1 (...); + parameter [255:0] INIT = 256'h0000000000000000000000000000000000000000000000000000000000000000; + output O; + input A0, A1, A2, A3, A4, A5, A6, A7; +endmodule + +module ROM32X1 (...); + parameter [31:0] INIT = 32'h00000000; + output O; + input A0, A1, A2, A3, A4; +endmodule + +module ROM64X1 (...); + parameter [63:0] INIT = 64'h0000000000000000; + output O; + input A0, A1, A2, A3, A4, A5; +endmodule + +module SRL16E (...); + parameter [15:0] INIT = 16'h0000; + parameter [0:0] IS_CLK_INVERTED = 1'b0; + output Q; + input A0, A1, A2, A3, CE, CLK, D; +endmodule + +module SRLC32E (...); + parameter [31:0] INIT = 32'h00000000; + parameter [0:0] IS_CLK_INVERTED = 1'b0; + output Q; + output Q31; + input [4:0] A; + input CE, CLK, D; +endmodule + +module STARTUPE2 (...); + parameter PROG_USR = "FALSE"; + parameter real SIM_CCLK_FREQ = 0.0; + output CFGCLK; + output CFGMCLK; + output EOS; + output PREQ; + input CLK; + input GSR; + input GTS; + input KEYCLEARB; + input PACK; + input USRCCLKO; + input USRCCLKTS; + input USRDONEO; + input USRDONETS; +endmodule + +module USR_ACCESSE2 (...); + output CFGCLK; + output DATAVALID; + output [31:0] DATA; +endmodule + +module XADC (...); + output BUSY; + output DRDY; + output EOC; + output EOS; + output JTAGBUSY; + output JTAGLOCKED; + output JTAGMODIFIED; + output OT; + output [15:0] DO; + output [7:0] ALM; + output [4:0] CHANNEL; + output [4:0] MUXADDR; + input CONVST; + input CONVSTCLK; + input DCLK; + input DEN; + input DWE; + input RESET; + input VN; + input VP; + input [15:0] DI; + input [15:0] VAUXN; + input [15:0] VAUXP; + input [6:0] DADDR; + parameter [15:0] INIT_40 = 16'h0; + parameter [15:0] INIT_41 = 16'h0; + parameter [15:0] INIT_42 = 16'h0800; + parameter [15:0] INIT_43 = 16'h0; + parameter [15:0] INIT_44 = 16'h0; + parameter [15:0] INIT_45 = 16'h0; + parameter [15:0] INIT_46 = 16'h0; + parameter [15:0] INIT_47 = 16'h0; + parameter [15:0] INIT_48 = 16'h0; + parameter [15:0] INIT_49 = 16'h0; + parameter [15:0] INIT_4A = 16'h0; + parameter [15:0] INIT_4B = 16'h0; + parameter [15:0] INIT_4C = 16'h0; + parameter [15:0] INIT_4D = 16'h0; + parameter [15:0] INIT_4E = 16'h0; + parameter [15:0] INIT_4F = 16'h0; + parameter [15:0] INIT_50 = 16'h0; + parameter [15:0] INIT_51 = 16'h0; + parameter [15:0] INIT_52 = 16'h0; + parameter [15:0] INIT_53 = 16'h0; + parameter [15:0] INIT_54 = 16'h0; + parameter [15:0] INIT_55 = 16'h0; + parameter [15:0] INIT_56 = 16'h0; + parameter [15:0] INIT_57 = 16'h0; + parameter [15:0] INIT_58 = 16'h0; + parameter [15:0] INIT_59 = 16'h0; + parameter [15:0] INIT_5A = 16'h0; + parameter [15:0] INIT_5B = 16'h0; + parameter [15:0] INIT_5C = 16'h0; + parameter [15:0] INIT_5D = 16'h0; + parameter [15:0] INIT_5E = 16'h0; + parameter [15:0] INIT_5F = 16'h0; + parameter IS_CONVSTCLK_INVERTED = 1'b0; + parameter IS_DCLK_INVERTED = 1'b0; + parameter SIM_DEVICE = "7SERIES"; + parameter SIM_MONITOR_FILE = "design.txt"; +endmodule + diff --git a/verilog/windows/autoyosys/share/xilinx/drams.txt b/verilog/windows/autoyosys/share/xilinx/drams.txt new file mode 100644 index 0000000..e6635d0 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/drams.txt @@ -0,0 +1,36 @@ + +bram $__XILINX_RAM64X1D + init 1 + abits 6 + dbits 1 + groups 2 + ports 1 1 + wrmode 0 1 + enable 0 1 + transp 0 0 + clocks 0 1 + clkpol 0 2 +endbram + +bram $__XILINX_RAM128X1D + init 1 + abits 7 + dbits 1 + groups 2 + ports 1 1 + wrmode 0 1 + enable 0 1 + transp 0 0 + clocks 0 1 + clkpol 0 2 +endbram + +match $__XILINX_RAM64X1D + make_outreg + or_next_if_better +endmatch + +match $__XILINX_RAM128X1D + make_outreg +endmatch + diff --git a/verilog/windows/autoyosys/share/xilinx/drams_bb.v b/verilog/windows/autoyosys/share/xilinx/drams_bb.v new file mode 100644 index 0000000..11168fe --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/drams_bb.v @@ -0,0 +1,20 @@ + +module RAM64X1D ( + output DPO, SPO, + input D, WCLK, WE, + input A0, A1, A2, A3, A4, A5, + input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, DPRA5 +); + parameter INIT = 64'h0; + parameter IS_WCLK_INVERTED = 1'b0; +endmodule + +module RAM128X1D ( + output DPO, SPO, + input D, WCLK, WE, + input [6:0] A, DPRA +); + parameter INIT = 128'h0; + parameter IS_WCLK_INVERTED = 1'b0; +endmodule + diff --git a/verilog/windows/autoyosys/share/xilinx/drams_map.v b/verilog/windows/autoyosys/share/xilinx/drams_map.v new file mode 100644 index 0000000..47476b5 --- /dev/null +++ b/verilog/windows/autoyosys/share/xilinx/drams_map.v @@ -0,0 +1,63 @@ + +module \$__XILINX_RAM64X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN); + parameter [63:0] INIT = 64'bx; + parameter CLKPOL2 = 1; + input CLK1; + + input [5:0] A1ADDR; + output A1DATA; + + input [5:0] B1ADDR; + input B1DATA; + input B1EN; + + RAM64X1D #( + .INIT(INIT), + .IS_WCLK_INVERTED(!CLKPOL2) + ) _TECHMAP_REPLACE_ ( + .DPRA0(A1ADDR[0]), + .DPRA1(A1ADDR[1]), + .DPRA2(A1ADDR[2]), + .DPRA3(A1ADDR[3]), + .DPRA4(A1ADDR[4]), + .DPRA5(A1ADDR[5]), + .DPO(A1DATA), + + .A0(B1ADDR[0]), + .A1(B1ADDR[1]), + .A2(B1ADDR[2]), + .A3(B1ADDR[3]), + .A4(B1ADDR[4]), + .A5(B1ADDR[5]), + .D(B1DATA), + .WCLK(CLK1), + .WE(B1EN) + ); +endmodule + +module \$__XILINX_RAM128X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN); + parameter [127:0] INIT = 128'bx; + parameter CLKPOL2 = 1; + input CLK1; + + input [6:0] A1ADDR; + output A1DATA; + + input [6:0] B1ADDR; + input B1DATA; + input B1EN; + + RAM128X1D #( + .INIT(INIT), + .IS_WCLK_INVERTED(!CLKPOL2) + ) _TECHMAP_REPLACE_ ( + .DPRA(A1ADDR), + .DPO(A1DATA), + + .A(B1ADDR), + .D(B1DATA), + .WCLK(CLK1), + .WE(B1EN) + ); +endmodule + diff --git a/verilog/windows/autoyosys/tmp.json b/verilog/windows/autoyosys/tmp.json new file mode 100644 index 0000000..e1b00c7 --- /dev/null +++ b/verilog/windows/autoyosys/tmp.json @@ -0,0 +1,284 @@ +{ + "creator": "Yosys 0.7 (git sha1 61f6811, i686-w64-mingw32.static-gcc 4.9.3 -Os)", + "modules": { + "mux": { + "attributes": { + "src": "autoyosys\\tmp.v:1" + }, + "ports": { + "a": { + "direction": "input", + "bits": [ 2 ] + }, + "b": { + "direction": "input", + "bits": [ 3 ] + }, + "c": { + "direction": "input", + "bits": [ 4 ] + }, + "d": { + "direction": "input", + "bits": [ 5 ] + }, + "s": { + "direction": "input", + "bits": [ 6, 7 ] + }, + "o": { + "direction": "output", + "bits": [ 8 ] + } + }, + "cells": { + "$auto$simplemap.cc:136:simplemap_reduce$77": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "autoyosys\\tmp.v:10" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 9 ], + "B": [ 7 ], + "Y": [ 10 ] + } + }, + "$auto$simplemap.cc:136:simplemap_reduce$87": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "autoyosys\\tmp.v:11" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ 11 ], + "Y": [ 12 ] + } + }, + "$auto$simplemap.cc:177:logic_reduce$68": { + "hide_name": 1, + "type": "$_OR_", + "parameters": { + }, + "attributes": { + "src": "autoyosys\\tmp.v:9" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ 7 ], + "Y": [ 13 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$90": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + "src": "autoyosys\\tmp.v:11" + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 4 ], + "B": [ 5 ], + "S": [ 12 ], + "Y": [ 14 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$91": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + "src": "autoyosys\\tmp.v:10" + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 3 ], + "B": [ 14 ], + "S": [ 10 ], + "Y": [ 15 ] + } + }, + "$auto$simplemap.cc:277:simplemap_mux$92": { + "hide_name": 1, + "type": "$_MUX_", + "parameters": { + }, + "attributes": { + "src": "autoyosys\\tmp.v:9" + }, + "port_directions": { + "A": "input", + "B": "input", + "S": "input", + "Y": "output" + }, + "connections": { + "A": [ 2 ], + "B": [ 15 ], + "S": [ 13 ], + "Y": [ 8 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$72": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": "autoyosys\\tmp.v:10" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 6 ], + "B": [ "1" ], + "Y": [ 9 ] + } + }, + "$auto$simplemap.cc:85:simplemap_bitop$83": { + "hide_name": 1, + "type": "$_XOR_", + "parameters": { + }, + "attributes": { + "src": "autoyosys\\tmp.v:11" + }, + "port_directions": { + "A": "input", + "B": "input", + "Y": "output" + }, + "connections": { + "A": [ 7 ], + "B": [ "1" ], + "Y": [ 11 ] + } + } + }, + "netnames": { + "$2\\o[0:0]": { + "hide_name": 1, + "bits": [ 15 ], + "attributes": { + "src": "autoyosys\\tmp.v:7" + } + }, + "$3\\o[0:0]": { + "hide_name": 1, + "bits": [ 14 ], + "attributes": { + "src": "autoyosys\\tmp.v:7" + } + }, + "$auto$simplemap.cc:168:logic_reduce$67": { + "hide_name": 1, + "bits": [ 13 ], + "attributes": { + } + }, + "$auto$simplemap.cc:250:simplemap_eqne$70": { + "hide_name": 1, + "bits": [ 9, 16 ], + "attributes": { + } + }, + "$auto$simplemap.cc:250:simplemap_eqne$80": { + "hide_name": 1, + "bits": [ 17, 11 ], + "attributes": { + } + }, + "$auto$simplemap.cc:256:simplemap_eqne$74": { + "hide_name": 1, + "bits": [ 10 ], + "attributes": { + } + }, + "$auto$simplemap.cc:256:simplemap_eqne$84": { + "hide_name": 1, + "bits": [ 12 ], + "attributes": { + } + }, + "a": { + "hide_name": 0, + "bits": [ 2 ], + "attributes": { + "src": "autoyosys\\tmp.v:2" + } + }, + "b": { + "hide_name": 0, + "bits": [ 3 ], + "attributes": { + "src": "autoyosys\\tmp.v:2" + } + }, + "c": { + "hide_name": 0, + "bits": [ 4 ], + "attributes": { + "src": "autoyosys\\tmp.v:2" + } + }, + "d": { + "hide_name": 0, + "bits": [ 5 ], + "attributes": { + "src": "autoyosys\\tmp.v:2" + } + }, + "o": { + "hide_name": 0, + "bits": [ 8 ], + "attributes": { + "src": "autoyosys\\tmp.v:4" + } + }, + "s": { + "hide_name": 0, + "bits": [ 6, 7 ], + "attributes": { + "src": "autoyosys\\tmp.v:3" + } + } + } + } + } +} diff --git a/verilog/windows/autoyosys/tmp.v b/verilog/windows/autoyosys/tmp.v new file mode 100644 index 0000000..b43dc1c --- /dev/null +++ b/verilog/windows/autoyosys/tmp.v @@ -0,0 +1,14 @@ +module mux (a, b, c, d, s, o); + input a,b,c,d; + input [1:0] s; + output o; + reg o; + + always @(a or b or c or d or s) + begin + if (s == 2'b00) o = a; + else if (s == 2'b01) o = b; + else if (s == 2'b10) o = c; + else o = d; + end +endmodule diff --git a/verilog/windows/autoyosys/yosys-abc.exe b/verilog/windows/autoyosys/yosys-abc.exe new file mode 100644 index 0000000000000000000000000000000000000000..f5e7b34a564c74ddad873c867597fcf7e6e400bd GIT binary patch literal 12452864 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 PBX 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%0DVRj^~*%kQZJT3}o>O+2Jz)rNNpl58}B4sQckE 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�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ⅇ9<_?b-C@x}KXF!2(tR9PGG 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 NMmm3+FEC4?q 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%0DL=mf4=bSN@n%l1A^dHwmb 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

-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

BcX86K`3i8d`ibG} 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¬ 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