Skip to content

Commit 9cf3169

Browse files
authored
Merge pull request #34 from EdNutting/split-merge
Split merge bit visualisation
2 parents e80f9ff + b012358 commit 9cf3169

File tree

3 files changed

+142
-35
lines changed

3 files changed

+142
-35
lines changed

src/com/modsim/modules/SplitMerge.java

Lines changed: 91 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import javax.swing.JOptionPane;
1212

13+
import com.modsim.modules.parts.VisiblePart;
1314
import com.modsim.modules.ports.BidirPort;
1415
import com.modsim.Main;
1516
import com.modsim.modules.parts.Port;
@@ -26,6 +27,9 @@ public class SplitMerge extends BaseModule {
2627
private final BidirPort portA0, portA1;
2728
private final BidirPort portB0, portB1, portB2, portB3;
2829

30+
private final SSText portA0Text, portA1Text;
31+
private final SSText portB0Text, portB1Text, portB2Text, portB3Text;
32+
2933
private final List<BezierCurve> curves;
3034

3135
public SplitMerge() {
@@ -79,14 +83,22 @@ public SplitMerge() {
7983
cs[8] = new BezierCurve(new Vec2(B + b1, 23), new Vec2(d - b0, -23), // B1-d0
8084
new Vec2(B + b1, -15), new Vec2(d - b0, 15));
8185
curves = Collections.unmodifiableList(Arrays.asList(cs));
82-
83-
parts.add(new SSText(A-8, 24, "DCBA", 7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily()));
84-
parts.add(new SSText(B-8, 24, "XXDC", 7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily()));
85-
parts.add(new SSText(a+8, -24, "XXBA", -7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily()));
86-
parts.add(new SSText(b+8, -24, "XXXB", -7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily()));
87-
parts.add(new SSText(c+8, -24, "XXDC", -7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily()));
88-
parts.add(new SSText(d+8, -24, "XXXD", -7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily()));
8986

87+
portA0Text = new SSText(A-8, 24, "DCBA", 7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily(), VisiblePart.RefreshMode.Dynamic);
88+
portA1Text = new SSText(B-8, 24, "XXDC", 7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily(), VisiblePart.RefreshMode.Dynamic);
89+
90+
portB0Text = new SSText(a+8, -24, "XXBA", -7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily(), VisiblePart.RefreshMode.Dynamic);
91+
portB1Text = new SSText(b+8, -24, "XXXB", -7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily(), VisiblePart.RefreshMode.Dynamic);
92+
portB2Text = new SSText(c+8, -24, "XXDC", -7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily(), VisiblePart.RefreshMode.Dynamic);
93+
portB3Text = new SSText(d+8, -24, "XXXD", -7, Colors.splitMergeLabel, Fonts.splitMergeLabel.getFamily(), VisiblePart.RefreshMode.Dynamic);
94+
95+
parts.add(portA0Text);
96+
parts.add(portA1Text);
97+
98+
parts.add(portB0Text);
99+
parts.add(portB1Text);
100+
parts.add(portB2Text);
101+
parts.add(portB3Text);
90102
}
91103

92104
@Override
@@ -95,42 +107,89 @@ public void paintStatic(Graphics2D g) {
95107
g.setColor(Colors.moduleFill);
96108
drawBox(g, 10);
97109

110+
drawStaticParts(g);
111+
}
112+
113+
@Override
114+
public void paintDynamic(Graphics2D g) {
98115
// Show drawing
99116
g.setStroke(new BasicStroke(2));
100117
for (int i = 0; i < curves.size(); i++) {
101118
int grad = 0;
102119
switch (i) {
103-
case 0:
104-
grad = 120;
105-
break;
106-
case 1:
107-
case 2:
108-
grad = 140;
109-
break;
110-
case 3:
111-
grad = 160;
112-
break;
113-
case 4:
114-
case 5:
115-
grad = 180;
116-
break;
117-
case 6:
118-
grad = 200;
119-
break;
120-
case 7:
121-
case 8:
122-
grad = 220;
123-
break;
120+
case 0:
121+
grad = 120;
122+
break;
123+
case 1:
124+
case 2:
125+
grad = 140;
126+
break;
127+
case 3:
128+
grad = 160;
129+
break;
130+
case 4:
131+
case 5:
132+
grad = 180;
133+
break;
134+
case 6:
135+
grad = 200;
136+
break;
137+
case 7:
138+
case 8:
139+
grad = 220;
140+
break;
124141
}
125142
g.setColor(new Color(grad, grad, grad));
126143
curves.get(i).draw(g);
127144
}
128145

146+
if (portA0.isConnected()) {
147+
portA0Text.setText(portA0.getVal().toString());
148+
}
149+
else {
150+
portA0Text.setText("DCBA");
151+
}
152+
153+
if (portA1.isConnected()) {
154+
portA1Text.setText(portA1.getVal().toString());
155+
}
156+
else {
157+
portA1Text.setText("XXDC");
158+
}
159+
160+
if (portB0.isConnected()) {
161+
portB0Text.setText(portB0.getVal().toString());
162+
}
163+
else {
164+
portB0Text.setText("XXBA");
165+
}
166+
167+
if (portB1.isConnected()) {
168+
portB1Text.setText(portB1.getVal().toString());
169+
}
170+
else {
171+
portB1Text.setText("XXXB");
172+
}
173+
174+
if (portB2.isConnected()) {
175+
portB2Text.setText(portB2.getVal().toString());
176+
}
177+
else {
178+
portB2Text.setText("XXDC");
179+
}
180+
181+
if (portB3.isConnected()) {
182+
portB3Text.setText(portB3.getVal().toString());
183+
}
184+
else {
185+
portB3Text.setText("XXXD");
186+
}
187+
129188
// Show output/input
130189
g.setColor(Colors.modulePorts);
131190
drawBidir(g);
132191

133-
drawStaticParts(g);
192+
drawDynamicParts(g);
134193
}
135194

136195
@Override
@@ -148,7 +207,7 @@ public void propagate() {
148207
if (portA0.wasUpdated() || portA1.wasUpdated()) {
149208
if(portA0.isConnected() && portA1.isConnected())
150209
{
151-
JOptionPane.showMessageDialog(Main.ui.pane, "Error: There must only be one connection to that size of split/merge.");
210+
JOptionPane.showMessageDialog(Main.ui.pane, "Error: There must only be one connection to that side of a split/merge.");
152211
Port port = portA0.wasUpdated()?portA0:portA1;
153212
synchronized (Main.sim)
154213
{
@@ -177,11 +236,11 @@ else if ( portB0.wasUpdated() || portB1.wasUpdated() ||
177236
a1_val.setBit(0, b2_val.getBit(0)); // c0-B0
178237

179238
// Resolution of 3-state logic for merges
180-
int val = b2_val.getBit(1) | b3_val.getBit(0);
239+
int val = BinData.mergeBits(b2_val.getBit(1), b3_val.getBit(0));
181240
a1_val.setBit(1, val);
182241
a0_val.setBit(3, val);
183242

184-
val = b0_val.getBit(1) | b1_val.getBit(0);
243+
val = BinData.mergeBits(b0_val.getBit(1), b1_val.getBit(0));
185244
a0_val.setBit(1, val);
186245
}
187246

src/com/modsim/modules/parts/SSText.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class SSText extends VisiblePart {
1111
private String text;
1212
private Font font;
1313
private Color color;
14+
private RefreshMode refreshMode = RefreshMode.Static;
1415

1516
/**
1617
* Create a label
@@ -45,7 +46,18 @@ public SSText(int x, int y, String txt, int fontSize, Color col) {
4546
fontSize);
4647
color = col;
4748
}
48-
49+
50+
public SSText(int x, int y, String txt, int fontSize, Color col, RefreshMode refreshMode) {
51+
this.x = x;
52+
this.y = y;
53+
text = txt;
54+
font = new Font(Fonts.moduleLabel.getFamily(),
55+
Fonts.moduleLabel.getStyle(),
56+
fontSize);
57+
color = col;
58+
this.refreshMode = refreshMode;
59+
}
60+
4961
public SSText(int x, int y, String txt, int fontSize, Color col, String font_name) {
5062
this.x = x;
5163
this.y = y;
@@ -55,7 +67,26 @@ public SSText(int x, int y, String txt, int fontSize, Color col, String font_nam
5567
fontSize);
5668
color = col;
5769
}
58-
70+
71+
public SSText(int x, int y, String txt, int fontSize, Color col, String font_name, RefreshMode refreshMode) {
72+
this.x = x;
73+
this.y = y;
74+
text = txt;
75+
font = new Font(font_name,
76+
Fonts.moduleLabel.getStyle(),
77+
fontSize);
78+
color = col;
79+
this.refreshMode = refreshMode;
80+
}
81+
82+
public void setText(String value) {
83+
text = value;
84+
}
85+
86+
public void setRefreshMode(RefreshMode value) {
87+
refreshMode = value;
88+
}
89+
5990
@Override
6091
public void paint(Graphics2D g) {
6192
// Draw the text
@@ -71,6 +102,6 @@ public void povTick() {
71102

72103
@Override
73104
public RefreshMode getRefreshMode() {
74-
return RefreshMode.Static;
105+
return refreshMode;
75106
}
76107
}

src/com/modsim/util/BinData.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,21 @@ public void set(BinData v) {
233233
mask = v.mask;
234234
}
235235

236+
public static int mergeBits(byte b0, byte b1) {
237+
if (b0 == 2 && b1 == 2) {
238+
return 2;
239+
}
240+
else if (b0 == 2) {
241+
return b1;
242+
}
243+
else if (b1 == 2) {
244+
return b0;
245+
}
246+
else if (b0 == b1) {
247+
return b0;
248+
}
249+
else {
250+
return 2;
251+
}
252+
}
236253
}

0 commit comments

Comments
 (0)