added mpardemo
[slipway.git] / src / edu / berkeley / slipway / Demo2.java
index 9906fca..68289db 100644 (file)
@@ -1,5 +1,6 @@
 package edu.berkeley.slipway;
 
+import static java.awt.event.KeyEvent.*;
 import edu.berkeley.slipway.*;
 import com.atmel.fpslic.*;
 import static com.atmel.fpslic.FpslicConstants.*;
@@ -13,19 +14,26 @@ import java.io.*;
 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);
@@ -36,6 +44,8 @@ public class Demo2 {
         root = root.north();
         root.ylut(LUT_SELF);
         root.yi(WEST);
+        root.out(1, true);
+        root.h(1, true);
         root.wi(L1);
         root.zi(L3);
 
@@ -53,9 +63,55 @@ public class Demo2 {
         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);
@@ -64,7 +120,134 @@ public class Demo2 {
         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();
+        }
+    }
 }