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