/******************************************************************************* * This file is part of logisim-evolution. * * logisim-evolution is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * logisim-evolution is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with logisim-evolution. If not, see <http://www.gnu.org/licenses/>. * * Original code by Carl Burch (http://www.cburch.com), 2011. * Subsequent modifications by : * + Haute École Spécialisée Bernoise * http://www.bfh.ch * + Haute École du paysage, d'ingénierie et d'architecture de Genève * http://hepia.hesge.ch/ * + Haute École d'Ingénierie et de Gestion du Canton de Vaud * http://www.heig-vd.ch/ * The project is currently maintained by : * + REDS Institute - HEIG-VD * Yverdon-les-Bains, Switzerland * http://reds.heig-vd.ch *******************************************************************************/ package com.bfh.logisim.library; import java.awt.Color; import java.awt.Graphics; import com.cburch.logisim.data.Attribute; import com.cburch.logisim.data.AttributeSet; import com.cburch.logisim.data.BitWidth; import com.cburch.logisim.data.Bounds; import com.cburch.logisim.data.Direction; import com.cburch.logisim.data.Value; import com.cburch.logisim.instance.InstanceFactory; import com.cburch.logisim.instance.InstancePainter; import com.cburch.logisim.instance.InstanceState; import com.cburch.logisim.instance.Port; import com.cburch.logisim.instance.StdAttr; import com.cburch.logisim.std.arith.Strings; public class bcd2sevenseg extends InstanceFactory{ static final int PER_DELAY = 1; public static final int Segment_A = 0; public static final int Segment_B = 1; public static final int Segment_C = 2; public static final int Segment_D = 3; public static final int Segment_E = 4; public static final int Segment_F = 5; public static final int Segment_G = 6; public static final int BCDin = 7; public bcd2sevenseg() { super("BCD_to_7_Segment_decoder", Strings.getter("BCD2SevenSegment")); setAttributes(new Attribute[] {StdAttr.DUMMY},new Object[] {""}); setOffsetBounds(Bounds.create(-10, -20, 50, 100)); Port[] ps = new Port[8]; ps[Segment_A] = new Port(20, 0, Port.OUTPUT, 1); ps[Segment_B] = new Port(30, 0, Port.OUTPUT, 1); ps[Segment_C] = new Port(20, 60, Port.OUTPUT, 1); ps[Segment_D] = new Port(10, 60, Port.OUTPUT, 1); ps[Segment_E] = new Port(0, 60, Port.OUTPUT, 1); ps[Segment_F] = new Port(10, 0, Port.OUTPUT, 1); ps[Segment_G] = new Port(0, 0, Port.OUTPUT, 1); ps[BCDin] = new Port(10,80,Port.INPUT,4); ps[Segment_A].setToolTip(Strings.getter("Segment_A")); ps[Segment_B].setToolTip(Strings.getter("Segment_B")); ps[Segment_C].setToolTip(Strings.getter("Segment_C")); ps[Segment_D].setToolTip(Strings.getter("Segment_D")); ps[Segment_E].setToolTip(Strings.getter("Segment_E")); ps[Segment_F].setToolTip(Strings.getter("Segment_F")); ps[Segment_G].setToolTip(Strings.getter("Segment_G")); ps[BCDin].setToolTip(Strings.getter("BCD Value")); setPorts(ps); } @Override public void paintInstance(InstancePainter painter) { Graphics g = painter.getGraphics(); Bounds MyBounds = painter.getBounds(); g.setColor(Color.BLUE); painter.drawRectangle(MyBounds, ""); painter.drawPort(BCDin, "BCD", Direction.SOUTH); // painter.drawBounds(); for (int i = 0 ; i < 7 ; i++) painter.drawPort(i); g.setColor(Color.BLACK); painter.drawRectangle(MyBounds.getX()+5, MyBounds.getY()+20, MyBounds.getWidth()-10, MyBounds.getHeight()-40, ""); } @Override public void propagate(InstanceState state) { if (state.getPortValue(BCDin).isFullyDefined()& !state.getPortValue(BCDin).isErrorValue()& !state.getPortValue(BCDin).isUnknown()) { int value = state.getPortValue(BCDin).toIntValue(); switch (value) { case 0 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); break; case 1 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); break; case 2 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); break; case 3 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); break; case 4 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); break; case 5 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); break; case 6 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); break; case 7 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); break; case 8 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); break; case 9 : state.setPort(Segment_A, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_B, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_C, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_D, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_E, Value.createKnown(BitWidth.create(1), 0), PER_DELAY); state.setPort(Segment_F, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); state.setPort(Segment_G, Value.createKnown(BitWidth.create(1), 1), PER_DELAY); break; default: state.setPort(Segment_A, Value.createUnknown(BitWidth.create(1)), PER_DELAY); state.setPort(Segment_B, Value.createUnknown(BitWidth.create(1)), PER_DELAY); state.setPort(Segment_C, Value.createUnknown(BitWidth.create(1)), PER_DELAY); state.setPort(Segment_D, Value.createUnknown(BitWidth.create(1)), PER_DELAY); state.setPort(Segment_E, Value.createUnknown(BitWidth.create(1)), PER_DELAY); state.setPort(Segment_F, Value.createUnknown(BitWidth.create(1)), PER_DELAY); state.setPort(Segment_G, Value.createUnknown(BitWidth.create(1)), PER_DELAY); break; } } else { for (int i = 0 ; i < 7 ; i++) state.setPort(i, Value.createUnknown(BitWidth.create(1)), PER_DELAY); } } @Override public boolean HDLSupportedComponent(String HDLIdentifier, AttributeSet attrs) { if (MyHDLGenerator == null) MyHDLGenerator = new bcd2sevensegHDLGeneratorFactory(); return MyHDLGenerator.HDLTargetSupported(HDLIdentifier, attrs); } }