source: liacs/ca/opdr2b/src/control.c@ 335

Last change on this file since 335 was 2, checked in by Rick van der Zwet, 15 years ago

Initial import of data of old repository ('data') worth keeping (e.g. tracking
means of URL access statistics)

  • Property svn:executable set to *
File size: 10.7 KB
RevLine 
[2]1/* Author : Rick van der Zwet
2 * S-number : 0433373
3 * Version : $Id: control.c 366 2007-12-04 18:29:07Z rick $
4 * Copyright : FreeBSD Licence
5 * Description : Memory unit
6 */
7
8#include <stdlib.h>
9#include <stdio.h>
10#include <sysexits.h>
11#include "control.h"
12#include "memory.h"
13#include "datapath.h"
14
15/* fcode, ocode, target */
16#define DECODE2_SIZE 17
17const decode_t decode2[DECODE2_SIZE] = {
18 { 8, 0, 18}, /* ADDI */
19 { 9, 0, 18}, /* ADDIU */
20 {10, 0, 39}, /* SLTI */
21 {11, 0, 39}, /* SLTIU */
22 {12, 0, 19}, /* ANDI */
23 {13, 0, 21}, /* ORI */
24 {14, 0, 23}, /* XORI */
25 {15, 0, 36}, /* LUI */
26 {32, 0, 59}, /* LB */
27 {33, 0, 65}, /* LH */
28 {35, 0, 71}, /* LW */
29 {36, 0, 62}, /* LBU */
30 {37, 0, 68}, /* LHU */
31 {40, 0, 44}, /* SB */
32 {41, 0, 50}, /* SH */
33 {43, 0, 56}, /* SW */
34};
35
36/* fcode, ocode, target */
37#define DECODE3_SIZE 20
38const decode_t decode3[DECODE3_SIZE] = {
39 { 0, 0, 27}, /* SLL */
40 { 2, 0, 28}, /* SRL */
41 { 3, 0, 29}, /* SRA */
42 { 4, 0, 30}, /* SLLV */
43 { 6, 0, 32}, /* SRLV */
44 { 7, 0, 34}, /* SRAV */
45 { 8, 0, 42}, /* JR */
46 { 9, 0, 37}, /* JALR */
47 {13, 0, 43}, /* BREAK */
48 {32, 0, 18}, /* ADD */
49 {33, 0, 18}, /* ADDU */
50 {34, 0, 26}, /* SUB */
51 {35, 0, 26}, /* SUBU */
52 {36, 0, 20}, /* AND */
53 {37, 0, 22}, /* OR */
54 {38, 0, 24}, /* XOR */
55 {39, 0, 25}, /* NOR */
56 {42, 0, 39}, /* SLT */
57 {43, 0, 39}, /* SLTU */
58};
59
60/*
61 * address, s1, s2, mux, constant, imm, alu, memory, a, b, c, temp, temp2, pc,
62 * mar, mdr, ir, reg, register_address_a, register_address_b,
63 * register_address_c, cond, jump
64 * XXX: Needs more pretty writing, the enums defined should be used
65 * XXX: More flexible input
66 */
67microcode_t microprogram[75] = {
68 { 0, {5, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0}, 2, 0},
69 { 1, {5, 8, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0}, 3, 0},
70 { 2, {1, 9, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, 0, 0},
71 { 3, {6, 8, 0, 3, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
72 { 4, {6, 8, 0,12, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0}, 0, 0},
73 { 5, {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, 2, 5},
74 { 6, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 0},
75 { 7, {1, 2, 0, 0, 0,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 6,10},
76 { 8, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1, 0},
77 { 9, {1, 2, 0, 0, 0,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 6, 0},
78 {10, {5, 9, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, 1, 0},
79 {11, {5, 8, 0, 5, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
80 {12, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,31}, 0, 0},
81 {13, {5, 8, 0, 9, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
82 {14, {9, 8, 0, 2, 3, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
83 {15, {5, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, 1, 0},
84 {16, {0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 5, 0},
85 {17, {0, 9, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 4, 0},
86 {18, {3, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
87 {19, {0, 9, 0, 0, 4, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
88 {20, {1, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
89 {21, {0, 9, 0, 0, 4, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
90 {22, {1, 3, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
91 {23, {0, 9, 0, 0, 4, 6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
92 {24, {1, 3, 0, 0, 0,11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
93 {25, {1, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
94 {26, {1, 3, 0, 0, 0,10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
95 {27, {3, 9, 0, 0, 2, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
96 {28, {3, 9, 0, 0, 2, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
97 {29, {3, 9, 0, 0, 2, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
98 {30, {1, 8, 0, 8, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
99 {31, {3, 4, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
100 {32, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
101 {33, {3, 4, 0, 0, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
102 {34, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
103 {35, {3, 4, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
104 {36, {3, 8, 0, 6, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
105 {37, {5, 8, 0, 5, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
106 {38, {1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, 1,72},
107 {39, {1, 3, 0, 0, 0,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 7,41},
108 {40, {0, 8, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
109 {41, {0, 8, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
110 {42, {1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, 1, 0},
111 {43, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,43},
112 {44, {3, 8, 0, 3, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
113 {45, {2, 8, 0, 7, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
114 {46, {3, 4, 0, 0, 0, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
115 {47, {8, 4, 0,11, 0, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
116 {48, {7, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, 0, 0},
117 {49, {3, 7, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, 1,57},
118 {50, {3, 8, 0, 3, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
119 {51, {2, 8, 0, 6, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
120 {52, {3, 4, 0, 0, 0, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
121 {53, {8, 4, 0,10, 0, 9, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
122 {54, {7, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, 0, 0},
123 {55, {3, 7, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, 1,57},
124 {56, {2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, 0, 0},
125 {57, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 2,57},
126 {58, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1, 0},
127 {59, {3, 8, 0, 3, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
128 {60, {7, 3, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
129 {61, {3, 8, 0, 7, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
130 {62, {3, 8, 0, 3, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
131 {63, {7, 3, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
132 {64, {3, 8, 0, 7, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
133 {65, {3, 8, 0, 3, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
134 {66, {7, 3, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
135 {67, {3, 8, 0, 6, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
136 {68, {3, 8, 0, 3, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
137 {69, {7, 3, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
138 {70, {3, 8, 0, 6, 0, 9, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 1,72},
139 {71, {7, 0, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 0},
140 {72, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 8,74},
141 {73, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0}, 1, 0},
142 {74, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0}, 1, 0},
143};
144
145void
146control_init()
147{
148 int i = 0; /* Loop counter */
149 mpc = 0;
150 a = 0;
151 b = 0;
152 c = 0;
153 temp = 0;
154 temp2 = 0;
155 pc = 0;
156 mar = 0;
157 mdr = 0;
158 ir = 0;
159 imm = 0;
160 constant = 0;
161 for (i = 0; i < 32; i++)
162 reg[i] = 0;
163}
164
165
166void
167find_new_mPC()
168{
169 word tcode = 0;
170 int i; /* Loop counter */
171 micro_address_t next_mpc;
172 switch (microprogram[mpc].cond) {
173 case NEXT:
174 next_mpc = mpc + 1;
175 break;
176 case UNCOND:
177 next_mpc = microprogram[mpc].jump;
178 break;
179 case MEMBUSY:
180 if (mem_busy == FALSE)
181 next_mpc = mpc + 1;
182 else
183 next_mpc = microprogram[mpc].jump;
184 break;
185 case DECODE1:
186 /* XXX: Hardcoded, need something better */
187 tcode = ir >> 26; /* O-code */
188 if (tcode >= 32) /* MEM */
189 next_mpc = 2;
190 else if (tcode >= 8) /* IMM */
191 next_mpc = 17;
192 else if (tcode == 5) /* BNQ */
193 next_mpc = 9;
194 else if (tcode == 4) /* BEQ */
195 next_mpc = 7;
196 else if (tcode == 3) /* JAL */
197 next_mpc = 11;
198 else if (tcode == 2) /* J */
199 next_mpc = 13;
200 else if (tcode == 0) /* REG */
201 next_mpc = 16;
202 break;
203 case DECODE2:
204 tcode = ir >> 26; /* O-code */
205 for (i = 0; i < DECODE2_SIZE; i++) {
206 if (decode2[i].ocode == tcode) {
207 next_mpc = decode2[i].target;
208 break;
209 }
210 }
211 break;
212 case DECODE3:
213 tcode = (ir << 26) >> 26; /* F-code */
214 for (i = 0; i < DECODE3_SIZE; i++) {
215 if (decode3[i].fcode == tcode) {
216 next_mpc = decode2[i].target;
217 break;
218 }
219 }
220 break;
221 case ZEROVALUE:
222 if (zero == TRUE)
223 next_mpc = microprogram[mpc].jump;
224 else
225 next_mpc = mpc + 1;
226 break;
227 case NEGVALUE:
228 if (negative == TRUE)
229 next_mpc = microprogram[mpc].jump;
230 else
231 next_mpc = mpc + 1;
232 break;
233 case RTYPEIR:
234 if ((ir >> 26) == 0)
235 next_mpc = microprogram[mpc].jump;
236 else
237 next_mpc = mpc + 1;
238 break;
239 default:
240 fprintf(stderr, "Control action '%i' not implemented\n",
241 microprogram[mpc].cond);
242 exit(EX_SOFTWARE);
243 break;
244 };
245
246 mpc = next_mpc;
247}
248
249
250void
251set_signals()
252{
253 /*
254 * XXX: Something like memory_busy or something like it
255 * XXX: Dirty hacking, we better off creating a sperate control
256 * struct which we 'feed' to datapath
257 */
258
259 switch (mpc) {
260 case 1:
261 mem_busy = TRUE;
262 microprogram[mpc].control.register_address_a = (ir << 6) >> 26;
263 microprogram[mpc].control.register_address_b = (ir << 11) >> 26;
264 break;
265 case 12:
266 microprogram[mpc].control.register_address_c = 31;
267 break;
268 case 73:
269 microprogram[mpc].control.register_address_c = (ir << 11) >> 26;
270 break;
271 case 74:
272 microprogram[mpc].control.register_address_c = (ir << 16) >> 26;
273 break;
274 }
275 update_state(microprogram[mpc].control);
276}
Note: See TracBrowser for help on using the repository browser.