From c8090510ff6533875c5faf1431be1376fde735b5 Mon Sep 17 00:00:00 2001 From: hneemann Date: Thu, 29 Mar 2018 12:10:00 +0200 Subject: [PATCH] inlining of many-to-one splitter --- .../digital/hdl/model2/HDLCircuit.java | 1 + .../model2/optimizations/InlineManyToOne.java | 36 +++++++++++++++++++ .../digital/hdl/vhdl2/VHDLGeneratorTest.java | 32 +++++++---------- 3 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 src/main/java/de/neemann/digital/hdl/model2/optimizations/InlineManyToOne.java diff --git a/src/main/java/de/neemann/digital/hdl/model2/HDLCircuit.java b/src/main/java/de/neemann/digital/hdl/model2/HDLCircuit.java index 91e591264..84be598ae 100644 --- a/src/main/java/de/neemann/digital/hdl/model2/HDLCircuit.java +++ b/src/main/java/de/neemann/digital/hdl/model2/HDLCircuit.java @@ -521,6 +521,7 @@ public class HDLCircuit implements Iterable, HDLModel.BitProvider, Prin public HDLCircuit applyDefaultOptimizations() throws HDLException { apply(new ReplaceOneToMany()); apply(new MergeAssignements()); + apply(new InlineManyToOne()); apply(new RemoveConstantSignals()); apply(new MergeConstants()); // under certain circumstances there are still constants apply(new NameConstantSignals()); diff --git a/src/main/java/de/neemann/digital/hdl/model2/optimizations/InlineManyToOne.java b/src/main/java/de/neemann/digital/hdl/model2/optimizations/InlineManyToOne.java new file mode 100644 index 000000000..28c2aba7c --- /dev/null +++ b/src/main/java/de/neemann/digital/hdl/model2/optimizations/InlineManyToOne.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018 Helmut Neemann. + * Use of this source code is governed by the GPL v3 license + * that can be found in the LICENSE file. + */ +package de.neemann.digital.hdl.model2.optimizations; + +import de.neemann.digital.hdl.model2.*; + +import java.util.Iterator; + +/** + * Inlines the inputs of the HDLNodeSplitterManyToOne. + */ +public class InlineManyToOne implements Optimization { + @Override + public void optimize(HDLCircuit circuit) { + Iterator it = circuit.iterator(); + while (it.hasNext()) { + HDLNode node = it.next(); + if (node instanceof HDLNodeAssignment) { + HDLNodeAssignment assign = (HDLNodeAssignment) node; + final HDLNet net = assign.getTargetNet(); + if (net.getInputs().size() == 1) { + HDLNode receiver = net.getInputs().get(0).getParent(); + if (receiver instanceof HDLNodeSplitterManyToOne) { + HDLNodeSplitterManyToOne mto = (HDLNodeSplitterManyToOne) receiver; + mto.replaceNetByExpression(net, assign.getExpression()); + it.remove(); + circuit.removeNet(net); + } + } + } + } + } +} diff --git a/src/test/java/de/neemann/digital/hdl/vhdl2/VHDLGeneratorTest.java b/src/test/java/de/neemann/digital/hdl/vhdl2/VHDLGeneratorTest.java index 66e6cb912..751085dab 100644 --- a/src/test/java/de/neemann/digital/hdl/vhdl2/VHDLGeneratorTest.java +++ b/src/test/java/de/neemann/digital/hdl/vhdl2/VHDLGeneratorTest.java @@ -104,13 +104,9 @@ public class VHDLGeneratorTest extends TestCase { "end main;\n" + "\n" + "architecture Behavioral of main is\n" + - " signal s0: std_logic_vector(1 downto 0);\n" + - " signal s1: std_logic_vector(1 downto 0);\n" + "begin\n" + - " s0 <= (A(1 downto 0) AND B(1 downto 0));\n" + - " s1 <= (A(3 downto 2) OR B(3 downto 2));\n" + - " S(1 downto 0) <= s0;\n" + - " S(3 downto 2) <= s1;\n" + + " S(1 downto 0) <= (A(1 downto 0) AND B(1 downto 0));\n" + + " S(3 downto 2) <= (A(3 downto 2) OR B(3 downto 2));\n" + "end Behavioral;\n",out.toString()); } @@ -163,20 +159,18 @@ public class VHDLGeneratorTest extends TestCase { "end main;\n" + "\n" + "architecture Behavioral of main is\n" + - " signal s0: std_logic_vector(7 downto 0);\n" + - " signal s1: std_logic;\n" + + " signal s0: std_logic;\n" + "begin\n" + - " s0 <= inst(7 downto 0);\n" + - " s1 <= inst(8);\n" + - " n9SD(7 downto 0) <= s0;\n" + - " n9SD(8) <= s1;\n" + - " n9SD(9) <= s1;\n" + - " n9SD(10) <= s1;\n" + - " n9SD(11) <= s1;\n" + - " n9SD(12) <= s1;\n" + - " n9SD(13) <= s1;\n" + - " n9SD(14) <= s1;\n" + - " n9SD(15) <= s1;\n" + + " s0 <= inst(8);\n" + + " n9SD(7 downto 0) <= inst(7 downto 0);\n" + + " n9SD(8) <= s0;\n" + + " n9SD(9) <= s0;\n" + + " n9SD(10) <= s0;\n" + + " n9SD(11) <= s0;\n" + + " n9SD(12) <= s0;\n" + + " n9SD(13) <= s0;\n" + + " n9SD(14) <= s0;\n" + + " n9SD(15) <= s0;\n" + "end Behavioral;\n",out.toString()); }