This plug-in uses javax.swing.JSpinner controls to determine a constant output. Value settings are retained in the .cct and .xml files. The default bitwidth is 16, however the action menu permits the user to select any bitwidth up to 64.
public class SigGen extends DLPlugIn {
/**
* Variable bit signal generator, with spinners to set output value
* @author rms
*/
private static final long serialVersionUID = DLFrame.SID;
private static final int DEFAULT_VALUE = 0, DEFAULT_BITWIDTH = 16;
private int BITWIDTH = 16, RESETPOS = 0, OUTPOS = 1;
private static final String VALUE_PROP = "Value", BITWIDTH_PROP = "Bitwidth";
public static PluginInfo info
= new PluginInfo("Variable bit signal generator with reset", "outputs configurable value");
public SigGen(Properties props) {
super(props);
setActions("Set Bit Width...");
construct();
}
public SigGen() throws Exception {
super(VALUE_PROP, Integer.toString(DEFAULT_VALUE), BITWIDTH_PROP, Integer.toString(DEFAULT_BITWIDTH));
setActions("Set Bit Width...");
construct();
}
public void construct() {
BITWIDTH = getBitWidth();
setInputSize(1);
setOutputSize(BITWIDTH);
setLabels("Reset", "out("+BITWIDTH+")");
setOutMap(BITWIDTH);
}
public void init() {
setValue(getIntegerProperty(VALUE_PROP));
}
public void prime() {
init();
}
public void performAction(int n) {
switch (n) {
case 0:
int bitWidth = getBitWidth();
int ans = getNewBitWidth(bitWidth);
if (bitWidth == ans) return;
setBitWidth(ans);
setValue(0);
break;
}
construct();
reInit();
}
public void evalState(int source, int val) {
if (pinToPos(source) == RESETPOS && val == 1) {
setValue(0);
}
}
public int getBitWidth() {return getIntegerProperty(BITWIDTH_PROP);}
public long getValue() {return getLongProperty(VALUE_PROP);}
public void setBitWidth(int bitWidth) {setProperty(BITWIDTH_PROP, bitWidth);}
public void setValue(long value) {
setProperty(VALUE_PROP, value);
((SigGenView)view).setValue(value);
putBundle(OUTPOS, value);
}
public static int getNewBitWidth(int current) {
String ans;
if ((ans =
JOptionPane.showInputDialog(DLFrame.frame, "Enter Bit
Width (1 - 64)", current))
== null) return current;
try {
int val = Integer.parseInt(ans);
if (val < 1 || val > 64) return current;
return val;
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(DLFrame.frame,
"Non-numerical Value",
"Number Error", JOptionPane.ERROR_MESSAGE);
return current;
}
}
}
package plugins.components;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerListModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import dlsim.DLFrame;
import dlsim.document.DLPlugIn;
import dlsim.view.util.UserPluginView;
public class SigGenView extends UserPluginView implements ChangeListener {
/**
* Custom view for SigGen, with spinners to set state
* @author rms
*/
private static final long serialVersionUID = DLFrame.SID;
private static final int RADIX = 16, LOGRADIX = 4, RADIXMASK = 15;
private int sLen = 4, partial;
private static String[] digList;
JSpinner[] spinners;
static {
digList = new String[RADIX];
for (int i = 0; i < RADIX; i++) digList[i] = Integer.toHexString(i);
}
public SigGenView(){
super();
}
public SigGenView(DLPlugIn plugin) {
super(plugin);
}
public void setup() {
int bitWidth = ((SigGen)plugDoc()).getBitWidth();
partial = bitWidth % LOGRADIX;
setSLen(bitWidth/LOGRADIX + ((partial == 0) ? 0 : 1));
setBGCOL(new Color(255, 150, 200));
setWD(sLen*33 + 77);
setHT(35);
setNoName(true);
}
private ChangeListener changeListener = new ChangeListener() {
public void stateChanged(ChangeEvent e) {
((SigGen)plugDoc()).setValue(getSpinnerVal());
if (getParent() != null) getParent().repaint();
}};
private long getSpinnerVal() {
long ans = 0;
for (int i = 0; i < sLen; i++) {
ans = (ans << LOGRADIX) + Integer.parseInt((String)spinners[i].getValue(), RADIX);
}
return ans;
}
private void setSpinnerVal(long val) {
for (int i = sLen-1; i >= 0; i--) {
int digit = (int)(val & RADIXMASK);
val = val >>> LOGRADIX;
spinners[i].setValue(Integer.toHexString(digit));
}
}
public void panelSetup() {
removeAll();
setBorder(BorderFactory.createEmptyBorder(0, getMARGIN(), 0, getMARGIN()));
int bitWidth = ((SigGen)plugDoc()).getBitWidth();
partial = bitWidth % LOGRADIX;
setSLen(bitWidth/LOGRADIX + ((partial == 0) ? 0 : 1));
spinners = new JSpinner[sLen];
setLayout(new FlowLayout());
JPanel sPanel = new JPanel();
sPanel.setLayout(new GridLayout(1, sLen, 0, 0));
sPanel.setOpaque(false);
if (partial > 0) {
int radix1 = (int)Math.pow(2.0, partial);
String[] digList1 = new String[radix1];
for (int i = 0; i < radix1; i++) digList1[i] = Integer.toHexString(i);
SpinnerListModel slm = new SpinnerListModel(digList1);
spinners[0] = new JSpinner(slm);
spinners[0].addChangeListener(changeListener);
sPanel.add(spinners[0]);
}
for (int i = ((partial == 0) ? 0 : 1); i < sLen; i++) {
SpinnerListModel slm = new SpinnerListModel(digList);
spinners[i] = new JSpinner(slm);
spinners[i].addChangeListener(changeListener);
sPanel.add(spinners[i]);
}
setSpinnerVal(((SigGen)plugDoc()).getValue());
add(sPanel);
validate();
repaint();
}
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
for (int i = 0; i < sLen; i++) spinners[i].setEnabled(enabled);
}
public void setValue(long val) {
setSpinnerVal(val);
}
public int getSLen() {return sLen;}
private void setSLen(int len) {
sLen = len;
}
}
Run DLSim 3 (using "ant run") and build the circuit shown below using SigGen
Exercises![]()