use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class ValueTable method computePreferredSize.
private void computePreferredSize() {
int oldCellHeight = cellHeight;
int oldTableWidth = tableWidth;
int oldTableHeight = tableHeight;
int columns = model == null ? 0 : model.getColumnCount();
if (columnWidth == null || columnWidth.length < columns)
columnWidth = new int[columns];
if (columns == 0) {
cellHeight = 16;
tableWidth = tableHeight = 0;
} else {
Graphics g = getGraphics();
int cellsWidth = 0;
if (g == null) {
cellHeight = 16;
cellsWidth = 24 * columns;
} else {
FontMetrics headerMetric = g.getFontMetrics(HEAD_FONT);
FontMetrics bodyMetric = g.getFontMetrics(BODY_FONT);
cellHeight = Math.max(headerMetric.getHeight(), bodyMetric.getHeight());
for (int i = 0; i < columns; i++) {
int radix = model.getColumnValueRadix(i);
// column should be at least as wide as 24, as header, and
// as formatted value
String header = model.getColumnName(i);
int cellWidth = Math.max(24, headerMetric.stringWidth(header));
BitWidth w = model.getColumnValueWidth(i);
if (w != null) {
Value val = Value.createKnown(w, (radix == 2 ? 0 : (radix == 10 ? (1 << (w.getWidth() - 1)) : w.getMask())));
String label = val.toDisplayString(radix);
cellWidth = Math.max(cellWidth, bodyMetric.stringWidth(label));
}
columnWidth[i] = cellWidth;
cellsWidth += cellWidth;
}
}
tableWidth = cellsWidth + COLUMN_SEP * (columns + 1);
tableHeight = cellHeight * model.getRowCount();
}
if (cellHeight != oldCellHeight || tableWidth != oldTableWidth || tableHeight != oldTableHeight) {
Dimension headSize = new Dimension(tableWidth, cellHeight + HEADER_SEP);
Dimension bodySize = new Dimension(tableWidth, tableHeight);
body.setPreferredSize(bodySize);
header.setPreferredSize(headSize);
body.revalidate();
header.revalidate();
}
}
use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class RegTabContent method fillArray.
/**
* This function will clear and fill the registers tab and refresh their
* value. It will start by iterate over all circuits of the current project
* to register all the "Register" components (providing their attributes are
* correctly set). It will then fill the panel with each register found,
* including their current value.
*/
private void fillArray() {
int y = 0;
MyLabel col1 = new MyLabel("Circuit", Font.ITALIC | Font.BOLD);
MyLabel col2 = new MyLabel("Reg name", Font.BOLD);
MyLabel col3 = new MyLabel("Value", Font.BOLD);
registers.clear();
panel.removeAll();
for (Circuit circ : proj.getLogisimFile().getCircuits()) {
getAllRegisters(circ);
}
if (proj.getLogisimFile().getLibrary("prodis_v1.3") instanceof LoadedLibrary) {
if (((LoadedLibrary) proj.getLogisimFile().getLibrary("prodis_v1.3")).getBase() instanceof LogisimFile) {
for (Circuit circ : ((LogisimFile) ((LoadedLibrary) proj.getLogisimFile().getLibrary("prodis_v1.3")).getBase()).getCircuits()) {
getAllRegisters(circ);
}
}
}
col1.setColor(Color.LIGHT_GRAY);
col2.setColor(Color.LIGHT_GRAY);
col3.setColor(Color.LIGHT_GRAY);
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.FIRST_LINE_START;
c.ipady = 2;
c.weighty = 0;
c.gridy = y;
c.gridx = 0;
c.weightx = 0.3;
panel.add(col1, c);
c.gridx++;
c.weightx = 0.5;
panel.add(col2, c);
c.gridx++;
c.weightx = 0.2;
panel.add(col3, c);
y++;
if (!registers.isEmpty()) {
Object[] objArr = registers.keySet().toArray();
Arrays.sort(objArr);
for (Object name : objArr) {
c.gridy = y;
c.gridx = 0;
String circuitName = name.toString().split("/")[0];
panel.add(new MyLabel(circuitName, Font.ITALIC, true), c);
c.gridx++;
String registerName = name.toString().split("/")[1];
panel.add(new MyLabel(registerName), c);
c.gridx++;
Component selReg = registers.get(name.toString());
CircuitState mainCircState = proj.getCircuitState();
while (mainCircState.getParentState() != null) {
// Get the main
// circuit
mainCircState = mainCircState.getParentState();
}
Value val = findVal(mainCircState, circuitName, selReg.getEnd(0).getLocation());
if (val != null) {
panel.add(new MyLabel(val.toHexString()), c);
} else {
panel.add(new MyLabel("-"), c);
}
y++;
}
}
c.weighty = 1;
c.gridy++;
c.gridx = 0;
c.weightx = 1;
panel.add(new MyLabel(""), c);
panel.validate();
}
use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class Model method propagationCompleted.
public void propagationCompleted() {
CircuitState circuitState = getCircuitState();
Value[] vals = new Value[selection.size()];
boolean changed = false;
for (int i = selection.size() - 1; i >= 0; i--) {
SelectionItem item = selection.get(i);
vals[i] = item.fetchValue(circuitState);
if (!changed) {
Value v = getValueLog(item).getLast();
changed = v == null ? vals[i] != null : !v.equals(vals[i]);
}
}
if (changed) {
for (int i = selection.size() - 1; i >= 0; i--) {
SelectionItem item = selection.get(i);
getValueLog(item).append(vals[i]);
}
fireEntryAdded(new ModelEvent(), vals);
}
}
use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class PullResistor method paintInstance.
@Override
public void paintInstance(InstancePainter painter) {
Location loc = painter.getLocation();
int x = loc.getX();
int y = loc.getY();
Graphics g = painter.getGraphics();
g.translate(x, y);
Value pull = getPullValue(painter.getAttributeSet());
Value actual = painter.getPortValue(0);
paintBase(painter, pull, pull.getColor(), actual.getColor());
g.translate(-x, -y);
painter.drawPorts();
}
use of com.cburch.logisim.data.Value in project logisim-evolution by reds-heig.
the class Transistor method drawInstance.
private void drawInstance(InstancePainter painter, boolean isGhost) {
Object type = painter.getAttributeValue(ATTR_TYPE);
Object powerLoc = painter.getAttributeValue(Wiring.ATTR_GATE);
Direction from = painter.getAttributeValue(StdAttr.FACING);
Direction facing = painter.getAttributeValue(StdAttr.FACING);
boolean flip = (facing == Direction.SOUTH || facing == Direction.WEST) == (powerLoc == Wiring.GATE_TOP_LEFT);
int degrees = Direction.EAST.toDegrees() - from.toDegrees();
double radians = Math.toRadians((degrees + 360) % 360);
int m = flip ? 1 : -1;
Graphics2D g = (Graphics2D) painter.getGraphics();
Location loc = painter.getLocation();
g.translate(loc.getX(), loc.getY());
g.rotate(radians);
Color gate;
Color input;
Color output;
Color platform;
if (!isGhost && painter.getShowState()) {
gate = painter.getPortValue(GATE).getColor();
input = painter.getPortValue(INPUT).getColor();
output = painter.getPortValue(OUTPUT).getColor();
Value out = computeOutput(painter);
platform = out.isUnknown() ? Value.UNKNOWN.getColor() : out.getColor();
} else {
Color base = g.getColor();
gate = base;
input = base;
output = base;
platform = base;
}
// input and output lines
GraphicsUtil.switchToWidth(g, Wire.WIDTH);
g.setColor(output);
g.drawLine(0, 0, -11, 0);
g.drawLine(-11, m * 7, -11, 0);
g.setColor(input);
g.drawLine(-40, 0, -29, 0);
g.drawLine(-29, m * 7, -29, 0);
// gate line
g.setColor(gate);
if (type == TYPE_P) {
g.drawLine(-20, m * 20, -20, m * 15);
GraphicsUtil.switchToWidth(g, 1);
g.drawOval(-22, m * 12 - 2, 4, 4);
} else {
g.drawLine(-20, m * 20, -20, m * 11);
GraphicsUtil.switchToWidth(g, 1);
}
// draw platforms
// gate platform
g.drawLine(-10, m * 10, -30, m * 10);
g.setColor(platform);
// input/output platform
g.drawLine(-9, m * 8, -31, m * 8);
// arrow (same color as platform)
g.drawLine(-21, m * 6, -18, m * 3);
g.drawLine(-21, 0, -18, m * 3);
g.rotate(-radians);
g.translate(-loc.getX(), -loc.getY());
}
Aggregations