1 /*
2  * Copyright (c) 2018 Helmut Neemann.
3  * Use of this source code is governed by the GPL v3 license
4  * that can be found in the LICENSE file.
5  */
6 package de.neemann.digital.hdl.model2.optimizations;
7 
8 import de.neemann.digital.core.wiring.Splitter;
9 import de.neemann.digital.hdl.model2.*;
10 import de.neemann.digital.hdl.model2.expression.ExprVarRange;
11 
12 import java.util.ArrayList;
13 import java.util.Iterator;
14 
15 /**
16  * Replace {@link HDLNodeSplitterOneToMany} by several {@link HDLNodeAssignment} instances.
17  */
18 public class ReplaceOneToMany implements Optimization {
19 
20     @Override
optimize(HDLCircuit circuit)21     public void optimize(HDLCircuit circuit) throws HDLException {
22         ArrayList<HDLNodeAssignment> newNodes = new ArrayList<>();
23 
24         Iterator<HDLNode> it = circuit.getNodes().iterator();
25         while (it.hasNext()) {
26             HDLNode n = it.next();
27             if (n instanceof HDLNodeSplitterOneToMany) {
28                 it.remove();
29                 replace((HDLNodeSplitterOneToMany) n, newNodes);
30             }
31         }
32 
33         circuit.getNodes().addAll(newNodes);
34     }
35 
replace(HDLNodeSplitterOneToMany n, ArrayList<HDLNodeAssignment> newNodes)36     private void replace(HDLNodeSplitterOneToMany n, ArrayList<HDLNodeAssignment> newNodes) throws HDLException {
37         final HDLPort inPort = n.getInputs().get(0);
38         HDLNet inNet = inPort.getNet();
39         inPort.setNet(null);
40 
41         int i = 0;
42         for (Splitter.Port p : n.getOutputSplit()) {
43             final HDLPort outPort = n.getOutputs().get(i);
44             if (outPort.getNet()!=null) {
45                 ExprVarRange exp = new ExprVarRange(inNet, p.getPos() + p.getBits() - 1, p.getPos());
46                 HDLNodeAssignment node = new HDLNodeAssignment("splitter", null, null);
47                 node.setExpression(exp);
48 
49                 node.addPort(new HDLPort("in", inNet, HDLPort.Direction.IN, inPort.getBits()));
50                 node.addPort(outPort);
51                 newNodes.add(node);
52             }
53             i++;
54         }
55 
56     }
57 }
58