Search in sources :

Example 6 with HDLPort

use of de.neemann.digital.hdl.model2.HDLPort in project Digital by hneemann.

the class NodeSorterExpressionBased method optimize.

@Override
public void optimize(HDLCircuit circuit) {
    ArrayList<HDLNode> nodes = circuit.getNodes();
    ArrayList<HDLNode> nodesAvail = new ArrayList<>(nodes);
    nodes.clear();
    HashSet<HDLNet> nets = new HashSet<>();
    for (HDLPort p : circuit.getInputs()) nets.add(p.getNet());
    // all nodes without an input at top!
    for (HDLNode n : nodesAvail) if (n.getInputs().isEmpty()) {
        nodes.add(n);
        for (HDLPort p : n.getOutputs()) if (p.getNet() != null)
            nets.add(p.getNet());
    }
    nodesAvail.removeAll(nodes);
    // then a layer sorting
    while (!nodesAvail.isEmpty()) {
        ArrayList<HDLNode> layer = new ArrayList<>();
        for (HDLNode n : nodesAvail) {
            if (n.traverseExpressions(new DependsOnlyOn(nets)).ok())
                layer.add(n);
        }
        if (layer.isEmpty()) {
            // circular dependency detected
            for (HDLNode n : nodesAvail) if (n.traverseExpressions(new DependsAtLeastOnOneOf(nets)).ok())
                layer.add(n);
        }
        if (layer.isEmpty())
            break;
        nodes.addAll(layer);
        nodesAvail.removeAll(layer);
        for (HDLNode n : layer) for (HDLPort p : n.getOutputs()) if (p.getNet() != null)
            nets.add(p.getNet());
    }
    // if there are unsolvable circular dependencies, keep old order
    if (!nodesAvail.isEmpty())
        nodes.addAll(nodesAvail);
}
Also used : HDLNet(de.neemann.digital.hdl.model2.HDLNet) ArrayList(java.util.ArrayList) HDLNode(de.neemann.digital.hdl.model2.HDLNode) HDLPort(de.neemann.digital.hdl.model2.HDLPort) HashSet(java.util.HashSet)

Example 7 with HDLPort

use of de.neemann.digital.hdl.model2.HDLPort in project Digital by hneemann.

the class ReplaceOneToMany method replace.

private void replace(HDLNodeSplitterOneToMany n, ArrayList<HDLNodeAssignment> newNodes) throws HDLException {
    final HDLPort inPort = n.getInputs().get(0);
    HDLNet inNet = inPort.getNet();
    inPort.setNet(null);
    int i = 0;
    for (Splitter.Port p : n.getOutputSplit()) {
        final HDLPort outPort = n.getOutputs().get(i);
        if (outPort.getNet() != null) {
            ExprVarRange exp = new ExprVarRange(inNet, p.getPos() + p.getBits() - 1, p.getPos());
            HDLNodeAssignment node = new HDLNodeAssignment("splitter", null, null);
            node.setExpression(exp);
            node.addPort(new HDLPort("in", inNet, HDLPort.Direction.IN, inPort.getBits()));
            node.addPort(outPort);
            newNodes.add(node);
        }
        i++;
    }
}
Also used : ExprVarRange(de.neemann.digital.hdl.model2.expression.ExprVarRange) Splitter(de.neemann.digital.core.wiring.Splitter)

Aggregations

HDLPort (de.neemann.digital.hdl.model2.HDLPort)3 ArrayList (java.util.ArrayList)3 ElementAttributes (de.neemann.digital.core.element.ElementAttributes)2 SplitPinString (de.neemann.digital.analyse.SplitPinString)1 Key (de.neemann.digital.core.element.Key)1 Splitter (de.neemann.digital.core.wiring.Splitter)1 de.neemann.digital.hdl.model2 (de.neemann.digital.hdl.model2)1 HDLNet (de.neemann.digital.hdl.model2.HDLNet)1 HDLNode (de.neemann.digital.hdl.model2.HDLNode)1 ClockInfo (de.neemann.digital.hdl.model2.clock.ClockInfo)1 ClockIntegratorGeneric (de.neemann.digital.hdl.model2.clock.ClockIntegratorGeneric)1 HDLClockIntegrator (de.neemann.digital.hdl.model2.clock.HDLClockIntegrator)1 ExprNot (de.neemann.digital.hdl.model2.expression.ExprNot)1 ExprVar (de.neemann.digital.hdl.model2.expression.ExprVar)1 ExprVarRange (de.neemann.digital.hdl.model2.expression.ExprVarRange)1 Expression (de.neemann.digital.hdl.model2.expression.Expression)1 TestCaseDescription (de.neemann.digital.testing.TestCaseDescription)1 TestingDataException (de.neemann.digital.testing.TestingDataException)1 Context (de.neemann.digital.testing.parser.Context)1 LineListener (de.neemann.digital.testing.parser.LineListener)1