protected TestComponent(ViewModelModifiable model)
{
super(model, 1, "Test");
- setInputCount(1);
setSubmodelScale(.4);
+ setInputPins("Test input pin");
GUICustomComponentCreator.create(submodelModifiable, "HalfAdder.json");
}
}
(String) m.get(SimpleRectangularSubmodelComponent.kLabel));
rect.setSubmodelScale(params.composition.innerScale);
rect.setSize(params.width, params.height);
- rect.setInputCount(((Number) m.get(SimpleRectangularSubmodelComponent.kInCount)).intValue());
- rect.setOutputCount(((Number) m.get(SimpleRectangularSubmodelComponent.kOutCount)).intValue());
+
+ // TODO names
+ int inputCount = ((Number) m.get(SimpleRectangularSubmodelComponent.kInCount)).intValue();
+ String[] inputNames = new String[inputCount];
+ for (int i = 0; i < inputCount; i++)
+ inputNames[i] = "Input pin #" + i;
+ rect.setInputPins(inputNames);
+
+ int outputCount = ((Number) m.get(SimpleRectangularSubmodelComponent.kOutCount)).intValue();
+ String[] outputPins = new String[outputCount];
+ for (int i = 0; i < outputCount; i++)
+ outputPins[i] = "Output pin #" + i;
+ rect.setOutputPins(outputPins);
+
return rect;
}
catch (ClassCastException | NullPointerException e)
private static final double width = 35;
private static final double pinDistance = 10;
- private static final double fontHeight = 5;
+ private static final double pinNameMargin = .5;
+ private static final double labelFontHeight = 5;
+ private static final double pinNameFontHeight = 3.5;
private final String label;
protected final int logicWidth;
this.outputSubmodelPinsUnmodifiable = Collections.unmodifiableList(outputSubmodelPins);
}
- protected void setInputCount(int inputCount)
+ protected void setInputPins(String... pinNames)
{
+ int inputCount = pinNames.length;
int oldInputCount = inputSupermodelPins.size();
double height = Math.max(inputCount, outputSupermodelPins.size()) * pinDistance;
setSize(width, height);
while (inputSupermodelPins.size() > inputCount)
{
inputSubmodelPins.remove(inputCount);
- removePin(inputSupermodelPins.remove(inputCount));
+ removeSubmodelInterface(inputSupermodelPins.remove(inputCount));
}
else if (oldInputCount < inputCount)
for (int i = oldInputCount; i < inputCount; i++)
{
- // TODO pin names
- Pin submodelPin = addSubmodelInterface("Input pin #" + i, logicWidth, 0, pinDistance / 2 + i * pinDistance);
+ Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, 0, pinDistance / 2 + i * pinDistance);
inputSubmodelPins.add(submodelPin);
inputSupermodelPins.add(getSupermodelPin(submodelPin));
}
+ for (int i = 0; i < Math.min(oldInputCount, inputCount); i++)
+ {
+ if (!inputSubmodelPins.get(i).name.equals(pinNames[i]))
+ {
+ removeSubmodelInterface(inputSupermodelPins.get(i));
+ Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, 0, pinDistance / 2 + i * pinDistance);
+ inputSubmodelPins.set(i, submodelPin);
+ inputSupermodelPins.set(i, getSupermodelPin(submodelPin));
+ }
+ }
}
- protected void setOutputCount(int outputCount)
+ protected void setOutputPins(String... pinNames)
{
+ int outputCount = pinNames.length;
int oldOutputCount = outputSupermodelPins.size();
setSize(width, Math.max(inputSupermodelPins.size(), outputCount) * pinDistance);
if (oldOutputCount > outputCount)
while (outputSupermodelPins.size() > outputCount)
{
outputSubmodelPins.remove(outputCount);
- removePin(outputSupermodelPins.get(outputCount));
+ removeSubmodelInterface(outputSupermodelPins.get(outputCount));
}
else if (oldOutputCount < outputCount)
for (int i = oldOutputCount; i < outputCount; i++)
{
- // TODO pin names
- Pin submodelPin = addSubmodelInterface("Output pin #" + i, logicWidth, width, pinDistance / 2 + i * pinDistance);
+ Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, width, pinDistance / 2 + i * pinDistance);
outputSubmodelPins.add(submodelPin);
outputSupermodelPins.add(getSupermodelPin(submodelPin));
}
+ for (int i = 0; i < Math.min(oldOutputCount, outputCount); i++)
+ {
+ if (!outputSubmodelPins.get(i).name.equals(pinNames[i]))
+ {
+ removeSubmodelInterface(outputSupermodelPins.get(i));
+ Pin submodelPin = addSubmodelInterface(pinNames[i], logicWidth, width, pinDistance / 2 + i * pinDistance);
+ outputSubmodelPins.set(i, submodelPin);
+ outputSupermodelPins.set(i, getSupermodelPin(submodelPin));
+ }
+ }
}
public List<Pin> getInputPins()
double posY = getBounds().y;
Font oldFont = gc.getFont();
- Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle());
- gc.setFont(labelFont);
+ gc.setFont(new Font(oldFont.getName(), labelFontHeight, oldFont.getStyle()));
Point textExtent = gc.textExtent(label);
gc.drawText(label, posX + (getBounds().width - textExtent.x) / 2, posY + (getBounds().height - textExtent.y) / 2, true);
+ gc.setFont(new Font(oldFont.getName(), pinNameFontHeight, oldFont.getStyle()));
+ for (int i = 0; i < inputSupermodelPins.size(); i++)
+ {
+ String pinName = inputSupermodelPins.get(i).name;
+ textExtent = gc.textExtent(pinName);
+ gc.drawText(pinName, posX + pinNameMargin, posY + i * pinDistance + (pinDistance - textExtent.y) / 2, true);
+ }
+ for (int i = 0; i < outputSupermodelPins.size(); i++)
+ {
+ String pinName = outputSupermodelPins.get(i).name;
+ textExtent = gc.textExtent(pinName);
+ gc.drawText(pinName, posX + width - textExtent.x - pinNameMargin, posY + i * pinDistance + (pinDistance - textExtent.y) / 2,
+ true);
+ }
gc.setFont(oldFont);
- // TODO draw pin names
}
@Override
{
super(model, 1, "_rsLatch");
setSubmodelScale(.4);
- setInputCount(2);
- setOutputCount(2);
+ setInputPins("_S", "_R");
+ setOutputPins("Q", "_Q");
initSubmodelComponents();
}
{
super(model, 1, "GUIand");
setSubmodelScale(.4);
- setInputCount(2);
- setOutputCount(1);
+ setInputPins("A", "B");
+ setOutputPins("Y");
initSubmodelComponents();
}
{
super(model, 1, "GUIand41");
setSubmodelScale(.4);
- setInputCount(5);
- setOutputCount(4);
+ setInputPins("A1", "A2", "A3", "A4", "B");
+ setOutputPins("Y1", "Y2", "Y3", "Y4");
initSubmodelComponents();
}
{
super(model, 1, "GUIandor414");
setSubmodelScale(.4);
- setInputCount(9);
- setOutputCount(4);
+ setInputPins("C1", "C2", "C3", "C4", "A1", "A2", "A3", "A4", "B");
+ setOutputPins("Y1", "Y2", "Y3", "Y4");
initSubmodelComponents();
}
{
super(model, 1, "GUIdemux2");
setSubmodelScale(.4);
- setInputCount(2);
- setOutputCount(4);
+ setInputPins("S0", "S1");
+ setOutputPins("Y00", "Y01", "Y10", "Y11");
initSubmodelComponents();
}
{
super(model, 1, "GUIdff");
setSubmodelScale(.2);
- setInputCount(2);
- setOutputCount(2);
+ setInputPins("C", "D");
+ setOutputPins("Q", "_Q");
initSubmodelComponents();
}
{
super(model, 1, "GUIdlatch");
setSubmodelScale(.4);
- setInputCount(2);
- setOutputCount(2);
+ setInputPins("D", "E");
+ setOutputPins("Q", "_Q");
initSubmodelComponents();
}
{
super(model, 1, "GUIdlatch4");
setSubmodelScale(.4);
- setInputCount(5);
- setOutputCount(4);
+ setInputPins("D1", "D2", "D3", "D4", "C");
+ setOutputPins("Q1", "Q2", "Q3", "Q4");
initSubmodelComponents();
}
{
super(model, 1, "GUIfulladder");
setSubmodelScale(.4);
- setInputCount(3);
- setOutputCount(2);
+ setInputPins("A", "B", "C");
+ setOutputPins("Y", "Z");
initSubmodelComponents();
}
{
super(model, 1, "GUIhalfadder");
setSubmodelScale(.4);
- setInputCount(2);
- setOutputCount(2);
+ setInputPins("A", "B");
+ setOutputPins("Y", "_Z");
initSubmodelComponents();
}
{
super(model, 1, "GUImux1");
setSubmodelScale(.4);
- setInputCount(3);
- setOutputCount(1);
+ setInputPins("S0", "I0", "I1");
+ setOutputPins("Y");
initSubmodelComponents();
}
{
super(model, 1, "GUImux1_4");
setSubmodelScale(.4);
- setInputCount(9);
- setOutputCount(4);
+ setInputPins("S0", "I0_1", "I0_2", "I0_3", "I0_4", "I1_1", "I1_2", "I1_3", "I1_4");
+ setOutputPins("Y1", "Y2", "Y3", "Y4");
initSubmodelComponents();
}
{
super(model, 1, "GUInand3");
setSubmodelScale(.4);
- setInputCount(3);
- setOutputCount(1);
+ setInputPins("A", "B", "C");
+ setOutputPins("Y");
initSubmodelComponents();
}
{
super(model, 1, "GUInot4");
setSubmodelScale(.4);
- setInputCount(4);
- setOutputCount(4);
+ setInputPins("A1", "A2", "A3", "A4");
+ setOutputPins("Y1", "Y2", "Y3", "Y4");
initSubmodelComponents();
}
{
super(model, 1, "GUIor4");
setSubmodelScale(.2);
- setInputCount(4);
- setOutputCount(1);
+ setInputPins("A1", "A2", "A3", "A4");
+ setOutputPins("Y");
initSubmodelComponents();
}
{
super(model, 1, "GUIor_4");
setSubmodelScale(.4);
- setInputCount(8);
- setOutputCount(4);
+ setInputPins("A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4");
+ setOutputPins("Y1", "Y2", "Y3", "Y4");
initSubmodelComponents();
}
{
super(model, 1, "GUIram2");
setSubmodelScale(.1);
- setInputCount(9);
- setOutputCount(8);
+ setInputPins("A0", "A1", "B0", "B1", "WE", "D1", "D2", "D3", "D4");
+ setOutputPins("QA1", "QA2", "QA3", "QA4", "QB1", "QB2", "QB3", "QB4");
initSubmodelComponents();
}
{
super(model, 1, "GUIram4");
setSubmodelScale(.1);
- setInputCount(13);
- setOutputCount(8);
+ setInputPins("A0", "A1", "A2", "A3", "B0", "B1", "B2", "B3", "WE", "D1", "D2", "D3", "D4");
+ setOutputPins("QA1", "QA2", "QA3", "QA4", "QB1", "QB2", "QB3", "QB4");
initSubmodelComponents();
}
{
super(model, 1, "GUIsel2_4");
setSubmodelScale(.4);
- setInputCount(10);
- setOutputCount(4);
+ setInputPins("SA", "SB", "A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4");
+ setOutputPins("Y1", "Y2", "Y3", "Y4");
initSubmodelComponents();
}
{
super(model, 1, "GUIsel3_4");
setSubmodelScale(.2);
- setInputCount(15);
- setOutputCount(4);
+ setInputPins("SA", "SB", "SC", "A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4", "C1", "C2", "C3", "C4");
+ setOutputPins("Y1", "Y2", "Y3", "Y4");
initSubmodelComponents();
}
{
super(model, 1, "GUIxor");
setSubmodelScale(.4);
- setInputCount(2);
- setOutputCount(1);
+ setInputPins("A", "B");
+ setOutputPins("Y");
initSubmodelComponents();
}
{
super(model, 1, "GUIAm2901ALUFuncDecode");
setSubmodelScale(.25);
- setInputCount(3);
- setOutputCount(3);
+ setInputPins("I5", "I4", "I3");
+ setOutputPins("CinE", "L", "SBE");
initSubmodelComponents();
}
{
super(model, 1, "GUIAm2901ALUInclDecode");
setSubmodelScale(.25);
- setInputCount(12);
- setOutputCount(6);
+ setInputPins("I5", "I4", "I3", "Cn", "R1", "R2", "R3", "R4", "S1", "S2", "S3", "S4");
+ setOutputPins("F1", "F2", "F3", "F4", "Cnplus4", "OVR");
initSubmodelComponents();
}
{
super(model, 1, "GUIAm2901ALUOneBit");
setSubmodelScale(.2);
- setInputCount(9);
- setOutputCount(2);
+ setInputPins("Cin", "CoutE", "CinE", "R", "RN", "S", "SN", "FN", "L");
+ setOutputPins("Cout", "F");
initSubmodelComponents();
}
{
super(model, 1, "GUIAm2901DestDecode");
setSubmodelScale(.25);
- setInputCount(3);
- setOutputCount(6);
+ setInputPins("I8", "I7", "I6");
+ setOutputPins("NSH", "RSH", "RAMWE", "YF", "LSH", "QWE");
initSubmodelComponents();
}
{
super(model, 1, "GUIAm2901QReg");
setSubmodelScale(.4);
- setInputCount(6);
- setOutputCount(4);
+ setInputPins("C", "WE", "D1", "D2", "D3", "D4");
+ setOutputPins("Q1", "Q2", "Q3", "Q4");
initSubmodelComponents();
}
{
super(model, 1, "Am2901SourceDecode");
setSubmodelScale(.25);
- setInputCount(3);
- setOutputCount(5);
+ setInputPins("I2", "I1", "I0");
+ setOutputPins("SQ", "RA", "SB", "SA", "RD");
initSubmodelComponents();
}