added debugging rectangles to circuit

This commit is contained in:
hneemann 2016-07-15 16:05:40 +02:00
parent ab5e853814
commit 6e738b960d
5 changed files with 94 additions and 3 deletions

View File

@ -243,7 +243,7 @@ public class CircuitBuilder implements BuilderInterface<CircuitBuilder> {
private void addFragmentToCircuit(Fragment fr, Circuit circuit) { private void addFragmentToCircuit(Fragment fr, Circuit circuit) {
fr.setPos(new Vector(0, 0)); fr.setPos(new Vector(0, 0));
de.neemann.digital.builder.circuit.Box b = fr.doLayout(); Box b = fr.doLayout();
fr.addToCircuit(new Vector(0, pos), circuit); fr.addToCircuit(new Vector(0, pos), circuit);
pos += b.getHeight() + SIZE * 2; pos += b.getHeight() + SIZE * 2;

View File

@ -4,6 +4,8 @@ import de.neemann.digital.core.element.ElementTypeDescription;
import de.neemann.digital.core.element.Key; import de.neemann.digital.core.element.Key;
import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.element.Keys;
import de.neemann.digital.core.element.PinDescription; import de.neemann.digital.core.element.PinDescription;
import de.neemann.digital.core.flipflops.FlipflopD;
import de.neemann.digital.core.flipflops.FlipflopJK;
import de.neemann.digital.draw.elements.Circuit; import de.neemann.digital.draw.elements.Circuit;
import de.neemann.digital.draw.elements.Pin; import de.neemann.digital.draw.elements.Pin;
import de.neemann.digital.draw.elements.Pins; import de.neemann.digital.draw.elements.Pins;
@ -15,6 +17,8 @@ import de.neemann.digital.draw.shapes.ShapeFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
/** /**
* A fragment describing a VisualElement * A fragment describing a VisualElement
* *
@ -91,7 +95,11 @@ public class FragmentVisualElement implements Fragment {
for (Vector p : outputs) for (Vector p : outputs)
mm.check(p); mm.check(p);
Vector delta = mm.getMax().sub(mm.getMin()); Vector delta = mm.getMax().sub(mm.getMin());
return new Box(delta.x, delta.y); if (visualElement.equalsDescription(FlipflopJK.DESCRIPTION)
|| visualElement.equalsDescription(FlipflopD.DESCRIPTION))
return new Box(delta.x, delta.y + SIZE); // Space for label
else
return new Box(delta.x, delta.y);
} }
@Override @Override

View File

@ -13,6 +13,8 @@ import de.neemann.digital.core.io.Out;
import de.neemann.digital.core.memory.DataField; import de.neemann.digital.core.memory.DataField;
import de.neemann.digital.core.wiring.Clock; import de.neemann.digital.core.wiring.Clock;
import de.neemann.digital.draw.graphics.Graphic; import de.neemann.digital.draw.graphics.Graphic;
import de.neemann.digital.draw.graphics.Polygon;
import de.neemann.digital.draw.graphics.Style;
import de.neemann.digital.draw.graphics.Vector; import de.neemann.digital.draw.graphics.Vector;
import de.neemann.digital.draw.shapes.Drawable; import de.neemann.digital.draw.shapes.Drawable;
import de.neemann.digital.draw.shapes.ShapeFactory; import de.neemann.digital.draw.shapes.ShapeFactory;
@ -48,6 +50,7 @@ public class Circuit {
private List<String> measurementOrdering; private List<String> measurementOrdering;
private transient boolean dotsPresent = false; private transient boolean dotsPresent = false;
private transient boolean modified = false; private transient boolean modified = false;
private transient ArrayList<CircRect> recs;
/** /**
* Creates a proper configurated XStream instance * Creates a proper configurated XStream instance
@ -183,6 +186,11 @@ public class Circuit {
p.drawTo(graphic, highLighted.contains(p)); p.drawTo(graphic, highLighted.contains(p));
graphic.closeGroup(); graphic.closeGroup();
} }
// plot debugging rectangles
if (recs != null)
for (CircRect r : recs)
r.drawTo(graphic);
} }
/** /**
@ -545,4 +553,37 @@ public class Circuit {
this.measurementOrdering = measurementOrdering; this.measurementOrdering = measurementOrdering;
} }
/**
* Add a rectangle to the circuit.
* Only used to debug the {@link de.neemann.digital.builder.circuit.CircuitBuilder}.
*
* @param pos pos of rectangle
* @param size size of rectangle
*/
public void addRect(Vector pos, Vector size) {
if (recs == null)
recs = new ArrayList<>();
recs.add(new CircRect(pos, size));
}
private static final class CircRect {
private final Vector pos;
private final Vector size;
private CircRect(Vector pos, Vector size) {
this.pos = pos;
this.size = size;
}
private void drawTo(Graphic graphic) {
Polygon p = new Polygon(true)
.add(pos)
.add(pos.add(size.x, 0))
.add(pos.add(size))
.add(pos.add(0, size.y));
graphic.drawPolygon(p, Style.DASH);
}
}
} }

View File

@ -1,13 +1,31 @@
package de.neemann.digital.builder.circuit; package de.neemann.digital.builder.circuit;
import de.neemann.digital.core.flipflops.FlipflopJK;
import de.neemann.digital.draw.elements.Tunnel;
import de.neemann.digital.draw.graphics.Vector;
import de.neemann.digital.draw.library.ElementLibrary;
import de.neemann.digital.draw.shapes.ShapeFactory;
import junit.framework.TestCase; import junit.framework.TestCase;
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
/** /**
* @author hneemann * @author hneemann
*/ */
public class FragmentExpressionTest extends TestCase { public class FragmentExpressionTest extends TestCase {
public void testCalcBackOffset1() throws Exception { public void testBox() throws Exception {
ShapeFactory shapeFactory = new ShapeFactory(new ElementLibrary());
FragmentVisualElement ve = new FragmentVisualElement(FlipflopJK.DESCRIPTION,shapeFactory);
FragmentExpression fe = new FragmentExpression(ve, new FragmentVisualElement(Tunnel.DESCRIPTION, shapeFactory));
fe.setPos(new Vector(0,0));
Box box = fe.doLayout();
assertEquals(SIZE*3, box.getHeight());
assertEquals(SIZE*4, box.getWidth());
}
public void testCalcBackOffset() throws Exception {
assertEquals(0, FragmentExpression.calcBackOffset(1, 0)); assertEquals(0, FragmentExpression.calcBackOffset(1, 0));
assertEquals(1, FragmentExpression.calcBackOffset(2, 0)); assertEquals(1, FragmentExpression.calcBackOffset(2, 0));

View File

@ -0,0 +1,24 @@
package de.neemann.digital.builder.circuit;
import de.neemann.digital.core.flipflops.FlipflopJK;
import de.neemann.digital.draw.graphics.Vector;
import de.neemann.digital.draw.library.ElementLibrary;
import de.neemann.digital.draw.shapes.ShapeFactory;
import junit.framework.TestCase;
import static de.neemann.digital.draw.shapes.GenericShape.SIZE;
/**
* @author hneemann
*/
public class FragmentVisualElementTest extends TestCase {
public void testBox() throws Exception {
ShapeFactory shapeFactory = new ShapeFactory(new ElementLibrary());
FragmentVisualElement ve = new FragmentVisualElement(FlipflopJK.DESCRIPTION,shapeFactory);
ve.setPos(new Vector(0,0));
Box box = ve.doLayout();
assertEquals(SIZE*3, box.getHeight());
assertEquals(SIZE*3, box.getWidth());
}
}