From 6acf49138d4de1a97fa96c780878967fb95e2d04 Mon Sep 17 00:00:00 2001 From: hneemann Date: Wed, 18 Nov 2020 08:06:32 +0100 Subject: [PATCH] bus splitter is able to transfer high-z states --- .../de/neemann/digital/core/wiring/BusSplitter.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/neemann/digital/core/wiring/BusSplitter.java b/src/main/java/de/neemann/digital/core/wiring/BusSplitter.java index de4688324..9d7af1a0c 100644 --- a/src/main/java/de/neemann/digital/core/wiring/BusSplitter.java +++ b/src/main/java/de/neemann/digital/core/wiring/BusSplitter.java @@ -37,6 +37,7 @@ public class BusSplitter extends Node implements Element { private ObservableValue commonIn; private boolean oe; private long commonD; + private long commonZ; private ObservableValues outputValues; /** @@ -77,12 +78,16 @@ public class BusSplitter extends Node implements Element { oe = oeValue.getBool(); if (oe) { commonD = commonIn.getValue(); + commonZ = commonIn.getHighZ(); } else { commonD = 0; + commonZ = 0; long mask = 1; for (int i = 0; i < bits; i++) { if (in[i].getBool()) commonD |= mask; + if (in[i].isHighZ()) + commonZ |= mask; mask <<= 1; } } @@ -94,13 +99,16 @@ public class BusSplitter extends Node implements Element { commonOut.setToHighZ(); long mask = 1; for (int i = 0; i < bits; i++) { - out[i].setBool((commonD & mask) != 0); + if ((commonZ & mask) != 0) + out[i].setToHighZ(); + else + out[i].setBool((commonD & mask) != 0); mask <<= 1; } } else { for (int i = 0; i < bits; i++) out[i].setToHighZ(); - commonOut.setValue(commonD); + commonOut.set(commonD, commonZ); } }