package edu.berkeley.slipway;
+import static java.awt.event.KeyEvent.*;
import edu.berkeley.slipway.*;
import com.atmel.fpslic.*;
import static com.atmel.fpslic.FpslicConstants.*;
import java.util.*;
import gnu.io.*;
-public class Demo2 {
+public class Demo2 implements KeyListener {
public static void main(String[] s) throws Exception {
- FtdiBoard device = new FtdiBoard();
- Fpslic at40k = device;
+ new Demo2().go();
+ }
+ public FtdiBoard device;
+ public Demo2() throws Exception {
+ device = new FtdiBoard();
+ }
+ public void go() throws Exception {
long begin = System.currentTimeMillis();
//FpslicUtil.readMode4(new ProgressInputStream("configuring fabric", System.in, 111740), device);
long end = System.currentTimeMillis();
Log.info(Demo.class, "finished in " + ((end-begin)/1000) + "s");
Thread.sleep(1000);
+
+
Log.info(Demo.class, "issuing command");
- Fpslic.Cell root = at40k.cell(5,5);
+ Fpslic.Cell root = device.cell(5,5);
root.ylut(LUT_SELF);
root.yi(NORTH);
root = root.north();
root.ylut(LUT_SELF);
root.yi(WEST);
+ root.out(1, true);
+ root.h(1, true);
root.wi(L1);
root.zi(L3);
root.zi(L0);
//root = root.n();
+ device.iob_bot(12, false).enableOutput(NW);
+ Fpslic.Cell c = device.cell(12, 0);
+ c.xo(c.east());
+ while(c.east() != null && c.east().east() != null) {
+ c.yo(c.east());
+ c = c.east();
+ }
device.flush();
- Gui3 vis = new Gui3(at40k, device);
+ Fpslic.Cell div = device.cell(19, 21);
+ while(true) {
+ AsyncPaperDemo.divider(div);
+ div = div.south().south();
+ if (div == null) break;
+ }
+ device.flush();
+
+ int MAX=17;
+ for(int x=2; x<MAX+1; x++) {
+ c = device.cell(x, 20);
+ Fpslic.Cell bridge = x==2 ? c.sw() : c.nw();
+ Fpslic.Cell pred = x==MAX ? c.south() : c.east();
+ Fpslic.Cell next = x==2 ? c.south() : c.west();
+ muller(c, pred, bridge, next);
+
+ c = c.south();
+ bridge = x==MAX ? c.ne() : c.se();
+ pred = x==2 ? c.north() : c.west();
+ next = x==MAX ? c.north() : c.east();
+ muller(c, pred, bridge, next);
+ }
+ //device.cell(MAX+0,20).yi(WEST);
+ //device.cell(MAX+0,20).ylut(LUT_SELF);
+ //device.cell(MAX+1,20).yi(WEST);
+ //device.cell(MAX+1,20).ylut(LUT_SELF);
+ device.cell(MAX+2,20).yi(WEST);
+ device.cell(MAX+2,20).ylut(LUT_SELF);
+ device.cell(MAX+2,20).xlut(LUT_OTHER);
+ device.cell(18,20).ylut(LUT_SELF);
+ device.flush();
+ go2();
+ }
+
+ public void go2() throws Exception {
+ setupScanCell();
+ device.flush();
+
+ vis = new Gui3((Fpslic)device, (FtdiBoard)device);
+ vis.addKeyListener(this);
Frame fr = new Frame();
fr.setLayout(new BorderLayout());
fr.add(vis, BorderLayout.CENTER);
vis.repaint();
fr.repaint();
fr.show();
- synchronized(Demo.class) { Demo.class.wait(); }
+ //synchronized(Demo.class) { Demo.class.wait(); }
+ while(true) {
+ try { Thread.sleep(500); } catch (Exception e) { }
+ synchronized(vis) {
+ scan();
+ }
+ }
+ }
+ Gui3 vis;
+ public void muller(Fpslic.Cell c, Fpslic.Cell pred, Fpslic.Cell bridge, Fpslic.Cell next) {
+ bridge.yi(next);
+ bridge.xlut(LUT_OTHER);
+
+ c.yi(pred);
+ c.xi(bridge);
+ c.b(false);
+ c.f(false);
+ c.c(YLUT);
+ c.t(TMUX_FB);
+ c.ylut((LUT_SELF & ~LUT_OTHER) |
+ (LUT_Z & ~LUT_OTHER) |
+ (LUT_Z & LUT_SELF));
+ }
+
+ public void setupScanCell() {
+ Fpslic fpslic = (Fpslic)device;
+ fpslic.cell(23,15).h(3, true);
+ fpslic.cell(23,15).yi(L3);
+ fpslic.cell(23,15).ylut(0xAA);
+ fpslic.iob_right(15, true).enableOutput(WEST);
+
+ fpslic.cell(23,0).ylut(0x00);
+ fpslic.iob_right(0, true).enableOutput(WEST);
+ fpslic.flush();
+ }
+
+ public void keyTyped(KeyEvent k) { }
+ public void keyReleased(KeyEvent k) { }
+ public void keyPressed(KeyEvent k) {
+ switch(k.getKeyCode()) {
+ case VK_SPACE:
+ scan();
+ break;
+ }
}
+ public void scan() {
+ for(int x=0; x<4; x++)
+ for(int y=0; y<4; y++)
+ scan(vis.ca[x][y]);
+ for(int x=0; x<4; x++)
+ for(int y=0; y<4; y++)
+ scan(vis.ca[x][y]);
+ }
+ public void scan(final GuiCell c) {
+ try {
+ final Fpslic.Cell cell = c.fpslicCell;
+ scan(device, cell, YLUT, true);
+ int x = cell.col;
+ int y = cell.row;
+ device.readBus(new BCB(c));
+ scan(device, cell, YLUT, false);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static void scan(Fpslic dev, Fpslic.Cell cell, int source, boolean setup) {
+ if (setup) {
+ //if (source != NONE) cell.c(source);
+ if (cell.b()) cell.b(false);
+ if (cell.f()) cell.f(false);
+ }
+ if (cell.out(L3)!=setup) cell.out(L3, setup);
+ if (cell.vx(L3)!=setup) cell.v(L3, setup);
+
+ Fpslic.SectorWire sw = cell.vwire(L3);
+ //System.out.println("wire is: " + sw);
+ if (sw.row > (12 & ~0x3) && sw.north()!=null && sw.north().drives(sw))
+ sw.north().drives(sw, false);
+ while(sw.row > (12 & ~0x3) && sw.south() != null) {
+ //System.out.println(sw + " -> " + sw.south());
+ if (sw.drives(sw.south())!=setup) sw.drives(sw.south(), setup);
+ sw = sw.south();
+ }
+ if (sw.row < (12 & ~0x3) && sw.south() != null && sw.south().drives(sw))
+ sw.north().drives(sw, false);
+ while(sw.row < (12 & ~0x3) && sw.north() != null) {
+ //System.out.println(sw + " -> " + sw.north());
+ if (sw.drives(sw.north())!=setup) sw.drives(sw.north(), setup);
+ sw = sw.north();
+ }
+
+ //cell = dev.cell(19, 15);
+ cell = dev.cell(cell.col, 15);
+ /*
+ System.out.println("cell is " + cell);
+ cell.xlut(0xff);
+ cell.ylut(0xff);
+ cell.b(false);
+ cell.f(false);
+ cell.c(XLUT);
+ cell.out(L3, true);
+ cell.oe(NONE);
+ */
+ if (cell.hx(L3) != setup) cell.h(L3, setup);
+ if (cell.vx(L3) != setup) cell.v(L3, setup);
+ sw = cell.hwire(L3);
+
+ if (sw.west()!=null && sw.west().drives(sw)) { sw.west().drives(sw, false); }
+ while(sw.east() != null) {
+ //System.out.println(sw + " -> " + sw.east());
+ if (sw.drives(sw.east())!=setup) sw.drives(sw.east(), setup);
+ sw = sw.east();
+ }
+
+ }
+
+
+ private class BCB extends FtdiBoard.ByteCallback {
+ GuiCell c;
+ public BCB(GuiCell c) {
+ this.c = c;
+ }
+ public void call(byte b) throws Exception {
+ boolean on = (b & 0x80) != 0;
+ c.val = on;
+ vis.repaint();
+ }
+ }
}