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;
}
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;
}
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++;
}
}
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;
}
Aggregations