checkpoint
[slipway.git] / src / edu / berkeley / obits / device / atmel / AtmelDevice.java
1 package edu.berkeley.obits.device.atmel;
2
3 import edu.berkeley.obits.*;
4 //import static edu.berkeley.cs.obits.device.atmel.Wires.*;
5 import java.util.*;
6 import java.io.*;
7 import org.ibex.util.Log;
8
9 public abstract class AtmelDevice {
10
11     public static class Util {
12         public static int lutSwap(int x) {
13             return
14                 (x & 0x80)        |
15                 ((x & 0x20) << 1) |
16                 ((x & 0x40) >> 1) |
17                 (x & 0x10) |
18                 (x & 0x08)        |
19                 ((x & 0x02) << 1) |
20                 ((x & 0x04) >> 1) |
21                 (x & 0x01);
22         }
23     }
24     
25     public static class Constants {
26         public static final int NONE  = -1;
27         public static final int L0    = 0;
28         public static final int L1    = 1;
29         public static final int L2    = 2;
30         public static final int L3    = 3;
31         public static final int L4    = 4;
32
33         public static final int NORTH = 8;
34         public static final int WEST  = 9;
35         public static final int SOUTH = 10;
36         public static final int EAST  = 11;
37
38         public static final int XLUT  = 12;
39         public static final int YLUT  = 13;
40         public static final int ZMUX  = 14;
41
42         public static final int H4    = 15;
43         public static final int V4    = 16;
44
45         public static final int NW    = 20;
46         public static final int SW    = 21;
47         public static final int NE    = 22;
48         public static final int SE    = 23;
49
50         public static final int SLOW   = 24;
51         public static final int MEDIUM = 25;
52         public static final int FAST   = 26;
53
54         public static final int ALWAYS_ON  = 27;
55         public static final int ALWAYS_OFF = 28;
56
57         public static final int FB    = 29;
58
59         public static final int LUT_SELF  = 0xAA;
60         public static final int LUT_Z     = 0xF0;
61         public static final int LUT_OTHER = 0xCC;
62
63         public static final int TMUX_W_AND_Z   = 0x00001001;
64         public static final int TMUX_W         = 0x00001002;
65         public static final int TMUX_Z         = 0x00001004;
66         public static final int TMUX_W_AND_FB  = 0x00001008;
67         public static final int TMUX_FB        = 0x00001010;
68
69
70     }
71
72     /** issue a command to the device in Mode4 format; see Gosset's documentation for further details */
73     public int getWidth() { return 24; }
74     public int getHeight() { return 24; }
75
76     private static String hex2(int i) {
77         String ret = Integer.toString(i, 16);
78         while(ret.length() < 2) ret = "0"+ret;
79         return ret.toUpperCase();
80     }
81
82     public void readMode4(InputStream in) throws IOException {
83         int count = 0;
84         BufferedReader br = new BufferedReader(new InputStreamReader(in));
85         for(String str = br.readLine(); str != null; str = br.readLine()) {
86             long foo = Long.parseLong(str, 16);
87             mode4((int)(foo >> 24), (int)(foo >> 16), (int)(foo >>  8), (int)(foo >>  0));
88             count++;
89         }
90         flush();
91         in.close();
92     }
93
94     public abstract void flush();
95
96     public void writeMode4(Writer w) throws IOException {
97         for(int x=0; x<getWidth(); x++)
98             for(int y=0; y<getWidth(); y++)
99                 for(int z=0; z<255; z++) {
100                     if ((z > 0x09 && z < 0x10) ||
101                         (z > 0x11 && z < 0x20) ||
102                         (z > 0x29 && z < 0x30) ||
103                         (z > 0x39 && z < 0x40) ||
104                         (z > 0x41 && z < 0x60) ||
105                         (z > 0x67 && z < 0x70) ||
106                         (z > 0x77 && z < 0xD0) ||
107                         (z > 0xD3))
108                         continue;
109                     w.write(hex2(z));
110                     w.write(hex2(y));
111                     w.write(hex2(x));
112                     w.write(hex2(mode4(z, y, x) & 0xff));
113                     w.write('\n');
114                 }
115         w.flush();
116     }
117
118
119     public abstract void mode4(int z, int y, int x, int d);
120     public abstract byte mode4(int z, int y, int x);
121     public          byte mode4zyx(int zyx) { return mode4(zyx>>24, (zyx>>16)&0xff, (zyx>>8)&0xff); }
122     public          void mode4zyx(int zyx, int d, int invmask) { mode4(zyx>>24, (zyx>>16)&0xff, (zyx>>8)&0xff, d, invmask); }
123     public          void mode4(int z, int y, int x, int d, int invmask) {
124         int old = mode4(z, y, x);
125         old &= ~invmask;
126         old |= d;
127         mode4(z, y, x, old);
128     }
129     public          void mode4zyx(int zyx, int bit, boolean set) { mode4(zyx>>24, (zyx>>16)&0xff, (zyx>>8)&0xff, bit, set); }
130     public          void mode4(int z, int y, int x, int bit, boolean set) {
131         int old = mode4(z, y, x);
132         old &= ~(1 << bit);
133         old |= set ? (1 << bit) : 0;
134         mode4(z, y, x, old);
135     }
136 }