"x": 0.0,
"y": 5.0
},
+ "name": "Input pin #0",
"logicWidth": 1
},
{
"x": 0.0,
"y": 15.0
},
+ "name": "Input pin #1",
"logicWidth": 1
},
{
"x": 0.0,
"y": 25.0
},
+ "name": "Input pin #2",
"logicWidth": 1
},
{
"x": 35.0,
"y": 5.0
},
+ "name": "Output pin #0",
"logicWidth": 1
},
{
"x": 35.0,
"y": 15.0
},
+ "name": "Output pin #1",
"logicWidth": 1
}
],
"x": 0.0,
"y": 5.0
},
+ "name": "A",
"logicWidth": 1
},
{
"x": 0.0,
"y": 15.0
},
+ "name": "B",
"logicWidth": 1
},
{
"x": 35.0,
"y": 5.0
},
+ "name": "Y",
"logicWidth": 1
},
{
"x": 35.0,
"y": 15.0
},
+ "name": "Z",
"logicWidth": 1
}
],
"x": 0.0,
"y": 5.0
},
+ "name": "Input pin #0",
"logicWidth": 1
}
],
import net.mograsim.logic.ui.model.ViewModelModifiable;
import net.mograsim.logic.ui.model.wires.Pin;
-// TODO make a superclass
public class AtomicAm2901NANDBased extends GUIComponent
{
public final List<String> inputNames;
this.outputNames = List.of("Y1", "Y2", "Y3", "Y4", "F=0", "Cn+4", "OVR", "F3_ORAMn+3", "ORAMn", "OQn", "OQn+3");
setSize(50, inputNames.size() * 10);
for (int i = 0; i < inputNames.size(); i++)
- addPin(new Pin(this, 1, 0, 5 + 10 * i));
+ addPin(new Pin(this, "Input pin #" + i, 1, 0, 5 + 10 * i));
for (int i = 0; i < outputNames.size(); i++)
- addPin(new Pin(this, 1, 50, 5 + 10 * i));
+ addPin(new Pin(this, "Output pin #" + i, 1, 50, 5 + 10 * i));
}
@Override
logicObs = (i) -> requestRedraw();
setSize(width, height);
- addPin(this.inputPin = new Pin(this, 1, 0, height / 2));
+ addPin(this.inputPin = new Pin(this, "", 1, 0, height / 2));
}
@Override
comp.setSize(params.width, params.height);
for (InterfacePinParams iPinParams : params.interfacePins)
{
- comp.addSubmodelInterface(iPinParams.logicWidth, iPinParams.location.x, iPinParams.location.y);
+ comp.addSubmodelInterface(iPinParams.name, iPinParams.logicWidth, iPinParams.location.x, iPinParams.location.y);
}
return comp;
}
logicObs = (i) -> requestRedraw();
setSize(width, height);
- addPin(this.outputPin = new Pin(this, 1, width, height / 2));
+ addPin(this.outputPin = new Pin(this, "", 1, width, height / 2));
}
@Override
this.logicWidth = logicWidth;
this.isInverted = isInverted;
this.rectWidth = width - (isInverted ? invertedCircleDiam : 0);
- this.outputPin = new MovablePin(this, logicWidth, width, 0);
+ this.outputPin = new MovablePin(this, "Y", logicWidth, width, 0);
addPin(outputPin);
this.inputPins = new ArrayList<>();
this.inputPinsUnmodifiable = Collections.unmodifiableList(inputPins);
else if (oldInputCount < inputCount)
for (int i = oldInputCount; i < inputCount; i++)
{
- Pin pin = new Pin(this, logicWidth, 0, pinDistance / 2 + i * pinDistance);
+ // TODO what for more than 26 input pins?
+ Pin pin = new Pin(this, "A" + i, logicWidth, 0, pinDistance / 2 + i * pinDistance);
inputPins.add(pin);
addPin(pin);
}
else if (oldInputCount < inputCount)
for (int i = oldInputCount; i < inputCount; i++)
{
- Pin submodelPin = addSubmodelInterface(logicWidth, 0, pinDistance / 2 + i * pinDistance);
+ // TODO pin names
+ Pin submodelPin = addSubmodelInterface("Input pin #" + i, logicWidth, 0, pinDistance / 2 + i * pinDistance);
inputSubmodelPins.add(submodelPin);
inputSupermodelPins.add(getSupermodelPin(submodelPin));
}
else if (oldOutputCount < outputCount)
for (int i = oldOutputCount; i < outputCount; i++)
{
- Pin submodelPin = addSubmodelInterface(logicWidth, width, pinDistance / 2 + i * pinDistance);
+ // TODO pin names
+ Pin submodelPin = addSubmodelInterface("Output pin #" + i, logicWidth, width, pinDistance / 2 + i * pinDistance);
outputSubmodelPins.add(submodelPin);
outputSupermodelPins.add(getSupermodelPin(submodelPin));
}
Point textExtent = gc.textExtent(label);
gc.drawText(label, posX + (getBounds().width - textExtent.x) / 2, posY + (getBounds().height - textExtent.y) / 2, true);
gc.setFont(oldFont);
+ // TODO draw pin names
}
@Override
import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InnerWireParams;
import net.mograsim.logic.ui.model.components.SubmodelComponentParams.InterfacePinParams;
import net.mograsim.logic.ui.model.wires.GUIWire;
+import net.mograsim.logic.ui.model.wires.MovablePin;
import net.mograsim.logic.ui.model.wires.Pin;
public abstract class SubmodelComponent extends GUIComponent
{
protected final ViewModelModifiable submodelModifiable;
public final ViewModel submodel;
- private final Map<PinMovable, PinMovable> submodelPinsPerSupermodelPin;
+ private final Map<MovablePin, MovablePin> submodelPinsPerSupermodelPin;
private final Map<Pin, Pin> submodelPinsPerSupermodelPinUnmodifiable;
- private final Map<PinMovable, PinMovable> supermodelPinsPerSubmodelPin;
+ private final Map<MovablePin, MovablePin> supermodelPinsPerSubmodelPin;
private final Map<Pin, Pin> supermodelPinsPerSubmodelPinUnmodifiable;
private final SubmodelInterface submodelInterface;
{
this.submodelScale = submodelScale;
- for (Entry<PinMovable, PinMovable> e : supermodelPinsPerSubmodelPin.entrySet())
+ for (Entry<MovablePin, MovablePin> e : supermodelPinsPerSubmodelPin.entrySet())
e.getKey().setRelPos(e.getValue().getRelX() * submodelScale, e.getValue().getRelY() * submodelScale);
requestRedraw();// needed if there is no submodel interface pin
/**
* Returns the submodel pin.
*/
- protected Pin addSubmodelInterface(int logicWidth, double relX, double relY)
+ protected Pin addSubmodelInterface(String name, int logicWidth, double relX, double relY)
{
- PinMovable submodelPin = new PinMovable(submodelInterface, logicWidth, relX / submodelScale, relY / submodelScale);
+ MovablePin submodelPin = new MovablePin(submodelInterface, name, logicWidth, relX / submodelScale, relY / submodelScale);
submodelInterface.addPin(submodelPin);
- PinMovable supermodelPin = new PinMovable(this, logicWidth, relX, relY);
+ MovablePin supermodelPin = new MovablePin(this, name, logicWidth, relX, relY);
addPin(supermodelPin);
submodelPinsPerSupermodelPin.put(supermodelPin, submodelPin);
protected void moveSubmodelInterface(Pin supermodelPin, double relX, double relY)
{
- PinMovable submodelPin = getSubmodelMovablePin(supermodelPin);
- PinMovable supermodelPinMovable = getSupermodelMovablePin(submodelPin);
+ MovablePin submodelPin = getSubmodelMovablePin(supermodelPin);
+ MovablePin supermodelPinMovable = getSupermodelMovablePin(submodelPin);
submodelPin.setRelPos(relX / submodelScale, relY / submodelScale);
supermodelPinMovable.setRelPos(relX, relY);
return getSupermodelMovablePin(submodelPin);
}
- protected PinMovable getSupermodelMovablePin(Pin submodelPin)
+ protected MovablePin getSupermodelMovablePin(Pin submodelPin)
{
return supermodelPinsPerSubmodelPin.get(submodelPin);
}
return getSubmodelMovablePin(supermodelPin);
}
- protected PinMovable getSubmodelMovablePin(Pin supermodelPin)
+ protected MovablePin getSubmodelMovablePin(Pin supermodelPin)
{
return submodelPinsPerSupermodelPin.get(supermodelPin);
}
return true;
}
- private static class PinMovable extends Pin
- {
- public PinMovable(GUIComponent component, int logicWidth, double relX, double relY)
- {
- super(component, logicWidth, relX, relY);
- }
-
- @Override
- protected void setRelPos(double relX, double relY)
- {
- super.setRelPos(relX, relY);
- }
- }
-
/**
* @return {@link SubmodelComponentParams}, which describe this {@link SubmodelComponent}.
*/
InterfacePinParams iPinParams = new InterfacePinParams();
iPins[i] = iPinParams;
iPinParams.location = p.getRelPos();
+ iPinParams.name = p.name;
iPinParams.logicWidth = p.logicWidth;
i++;
}
public static class InterfacePinParams
{
public Point location;
+ public String name;
public int logicWidth;
}
public class MovablePin extends Pin
{
- public MovablePin(GUIComponent component, int logicWidth, double relX, double relY)
+ public MovablePin(GUIComponent component, String name, int logicWidth, double relX, double relY)
{
- super(component, logicWidth, relX, relY);
+ super(component, name, logicWidth, relX, relY);
}
@Override
import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle;
import net.mograsim.logic.ui.model.components.GUIComponent;
-//TODO add an ID and/or a name
public class Pin
{
public final GUIComponent component;
+ public final String name;
public final int logicWidth;
protected double relX;
private final List<Consumer<? super Pin>> pinMovedListeners;
private final List<Runnable> redrawListeners;
- public Pin(GUIComponent component, int logicWidth, double relX, double relY)
+ public Pin(GUIComponent component, String name, int logicWidth, double relX, double relY)
{
this.component = component;
+ this.name = name;
this.logicWidth = logicWidth;
this.relX = relX;
this.relY = relY;
\r
this.logicWidth = logicWidth;\r
setSize(CIRCLE_DIAM, CIRCLE_DIAM);\r
- addPin(this.pin = new Pin(this, logicWidth, CIRCLE_RADIUS, CIRCLE_RADIUS));\r
+ addPin(this.pin = new Pin(this, "", logicWidth, CIRCLE_RADIUS, CIRCLE_RADIUS));\r
}\r
\r
public void moveCenterTo(double x, double y)\r