Search in sources :

Example 1 with Splitter

use of de.neemann.digital.core.wiring.Splitter in project Digital by hneemann.

the class ModelAnalyser method checkBinaryInputs.

private ArrayList<Signal> checkBinaryInputs(ArrayList<Signal> list) throws AnalyseException {
    ArrayList<Signal> inputs = new ArrayList<>();
    for (Signal s : list) {
        final int bits = s.getValue().getBits();
        if (bits == 1)
            inputs.add(s);
        else {
            try {
                Splitter sp = Splitter.createNToOne(bits);
                final ObservableValue out = sp.getOutputs().get(0);
                out.addObserver(new NodeWithoutDelay(s.getValue()) {

                    @Override
                    public void hasChanged() {
                        s.getValue().setValue(out.getValue());
                    }
                });
                out.fireHasChanged();
                SplitPinString pins = SplitPinString.create(s);
                ObservableValues.Builder builder = new ObservableValues.Builder();
                for (int i = bits - 1; i >= 0; i--) {
                    ObservableValue o = new ObservableValue(s.getName() + i, 1);
                    builder.add(o);
                    inputs.add(new Signal(s.getName() + i, o).setPinNumber(pins.getPin(i)));
                }
                final ObservableValues inputsList = builder.reverse().build();
                sp.setInputs(inputsList);
                modelAnalyzerInfo.addInputBus(s.getName(), inputsList.getNames());
            } catch (NodeException e) {
                throw new AnalyseException(e);
            }
        }
    }
    return inputs;
}
Also used : Splitter(de.neemann.digital.core.wiring.Splitter) ArrayList(java.util.ArrayList)

Example 2 with Splitter

use of de.neemann.digital.core.wiring.Splitter in project Digital by hneemann.

the class ModelAnalyser method replaceMultiBitFlipflops.

private List<FlipflopD> replaceMultiBitFlipflops(List<FlipflopD> flipflops) throws AnalyseException {
    ArrayList<FlipflopD> out = new ArrayList<>();
    for (FlipflopD ff : flipflops) {
        if (ff.getBits() == 1)
            out.add(ff);
        else {
            try {
                model.removeNode(ff);
                ff.getDInput().removeObserver(ff);
                ff.getClock().removeObserver(ff);
                Splitter insp = Splitter.createOneToN(ff.getBits());
                insp.setInputs(new ObservableValues(ff.getDInput()));
                ff.getDInput().fireHasChanged();
                Splitter outsp = Splitter.createNToOne(ff.getBits());
                ObservableValues.Builder spinput = new ObservableValues.Builder();
                String label = ff.getLabel();
                if (label.length() == 0)
                    label = createUniqueName(ff);
                for (int i = ff.getBits() - 1; i >= 0; i--) {
                    ObservableValue qn = new ObservableValue("", 1);
                    ObservableValue nqn = new ObservableValue("", 1);
                    FlipflopD newff = new FlipflopD(label + i, qn, nqn);
                    spinput.addAtTop(qn);
                    model.add(newff);
                    newff.setInputs(new ObservableValues(insp.getOutputs().get(i), getClock()));
                    out.add(newff);
                }
                outsp.setInputs(spinput.build());
                for (ObservableValue v : spinput) v.fireHasChanged();
                final ObservableValue qout = ff.getOutputs().get(0);
                final ObservableValue nqout = ff.getOutputs().get(1);
                ObservableValue spq = outsp.getOutputs().get(0);
                spq.addObserver(new NodeWithoutDelay(qout, nqout) {

                    @Override
                    public void hasChanged() {
                        final long value = spq.getValue();
                        qout.setValue(value);
                        nqout.setValue(~value);
                    }
                });
                spq.fireHasChanged();
            } catch (NodeException e) {
                throw new AnalyseException(e);
            }
        }
    }
    return out;
}
Also used : FlipflopD(de.neemann.digital.core.flipflops.FlipflopD) Splitter(de.neemann.digital.core.wiring.Splitter) ArrayList(java.util.ArrayList)

Example 3 with Splitter

use of de.neemann.digital.core.wiring.Splitter 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)

Example 4 with Splitter

use of de.neemann.digital.core.wiring.Splitter in project Digital by hneemann.

the class ModelAnalyser method checkBinaryOutputs.

private ArrayList<Signal> checkBinaryOutputs(ArrayList<Signal> list) throws AnalyseException {
    ArrayList<Signal> outputs = new ArrayList<>();
    for (Signal s : list) {
        final int bits = s.getValue().getBits();
        if (bits == 1)
            outputs.add(s);
        else {
            try {
                Splitter sp = Splitter.createOneToN(bits);
                sp.setInputs(s.getValue().asList());
                SplitPinString pins = SplitPinString.create(s);
                final ObservableValues spOutputs = sp.getOutputs();
                for (int i = spOutputs.size() - 1; i >= 0; i--) outputs.add(new Signal(s.getName() + i, spOutputs.get(i)).setPinNumber(pins.getPin(i)));
                s.getValue().fireHasChanged();
                ArrayList<String> names = new ArrayList<>(bits);
                for (int i = 0; i < bits; i++) names.add(s.getName() + i);
                modelAnalyzerInfo.addOutputBus(s.getName(), names);
            } catch (NodeException e) {
                throw new AnalyseException(e);
            }
        }
    }
    return outputs;
}
Also used : Splitter(de.neemann.digital.core.wiring.Splitter) ArrayList(java.util.ArrayList)

Aggregations

Splitter (de.neemann.digital.core.wiring.Splitter)4 ArrayList (java.util.ArrayList)3 FlipflopD (de.neemann.digital.core.flipflops.FlipflopD)1 ExprVarRange (de.neemann.digital.hdl.model2.expression.ExprVarRange)1