OpenCores
URL https://opencores.org/ocsvn/plasma/plasma/trunk

Subversion Repositories plasma

[/] [plasma/] [trunk/] [kernel/] [rtos_test.c] - Blame information for rev 425

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 138 rhoads
/*--------------------------------------------------------------------
2
 * TITLE: Test Plasma Real Time Operating System
3
 * AUTHOR: Steve Rhoads (rhoadss@yahoo.com)
4
 * DATE CREATED: 1/1/06
5
 * FILENAME: rtos_test.c
6
 * PROJECT: Plasma CPU core
7
 * COPYRIGHT: Software placed into the public domain by the author.
8
 *    Software 'as is' without warranty.  Author liable for nothing.
9
 * DESCRIPTION:
10
 *    Test Plasma Real Time Operating System
11
 *--------------------------------------------------------------------*/
12 407 rhoads
#ifdef WIN32
13
#include <stdlib.h>
14
#endif
15 138 rhoads
#include "plasma.h"
16
#include "rtos.h"
17 226 rhoads
#include "tcpip.h"
18 138 rhoads
 
19 190 rhoads
/* Including mmu.h will cause all OS calls to use SYSCALL */
20
//#include "mmu.h"
21
 
22 312 rhoads
//#define DLL_SETUP
23
//#define DLL_CALL
24
//#include "dll.h"
25
 
26 190 rhoads
#define SEMAPHORE_COUNT 50
27
#define TIMER_COUNT     10
28
 
29 138 rhoads
extern void TestMathFull(void);
30
 
31 190 rhoads
typedef struct {
32
   OS_Thread_t *MyThread[TIMER_COUNT];
33
   OS_Semaphore_t *MySemaphore[SEMAPHORE_COUNT];
34
   OS_Mutex_t *MyMutex;
35
   OS_Timer_t *MyTimer[TIMER_COUNT];
36
   OS_MQueue_t *MyQueue[TIMER_COUNT];
37
   int TimerDone;
38
} TestInfo_t;
39
 
40
int Global;
41
 
42 138 rhoads
//******************************************************************
43
static void TestCLib(void)
44
{
45
   char s1[80], s2[80], *ptr;
46
   int rc, v1, v2, v3;
47
 
48
   printf("TestCLib\n");
49
   strcpy(s1, "Hello ");
50 336 rhoads
   memset(s2, 0, sizeof(s2));
51 138 rhoads
   strncpy(s2, "World wide", 5);
52
   strcat(s1, s2);
53 400 rhoads
   strncat(s1, "!\nthing", 2);
54 138 rhoads
   printf("%s", s1);
55
   rc = strcmp(s1, "Hello World!\n");
56
   assert(rc == 0);
57
   rc = strcmp(s1, "Hello WOrld!\n");
58
   assert(rc > 0);
59
   rc = strcmp(s1, "Hello world!\n");
60
   assert(rc < 0);
61
   rc = strncmp(s1, "Hellx", 4);
62
   assert(rc == 0);
63
   ptr = strstr(s1, "orl");
64 425 rhoads
   assert(ptr && ptr[0] == 'o');
65 138 rhoads
   rc = strlen(s1);
66
   assert(rc == 13);
67
   memcpy(s2, s1, rc+1);
68
   rc = memcmp(s1, s2, 8);
69
   assert(rc == 0);
70
   s2[5] = 'z';
71
   rc = memcmp(s1, s2, 8);
72
   assert(rc != 0);
73
   memset(s2, 0, 5);
74
   memset(s2, 'a', 3);
75
   rc = abs(-5);
76 154 rhoads
   itoa(1234, s1, 10);
77
   itoa(0, s1, 10);
78
   itoa(-1234, s1, 10);
79
   itoa(0xabcd, s1, 16);
80
   itoa(0x12ab, s1, 16);
81
   sprintf(s1, "test c%c d%d 0x%x s%s End\n", 'C', 1234, 0xabcd, "String");
82 138 rhoads
   printf("%s", s1);
83 154 rhoads
   sprintf(s1, "test c%c d%6d 0x%6x s%8s End\n", 'C', 1234, 0xabcd, "String");
84 138 rhoads
   printf("%s", s1);
85
   sscanf("1234 -1234 0xabcd text h", "%d %d %x %s", &v1, &v2, &v3, s1);
86
   assert(v1 == 1234 && v2 == -1234 && v3 == 0xabcd);
87
   assert(strcmp(s1, "text") == 0);
88
   //UartScanf("%d %d", &v1, &v2);
89
   //printf("v1 = %d v2 = %d\n", v1, v2);
90
   printf("Done.\n");
91
}
92
 
93
//******************************************************************
94
static void TestHeap(void)
95
{
96
   uint8 *ptrs[256], size[256], *ptr;
97
   int i, j, k, value;
98
 
99
   printf("TestHeap\n");
100
   memset(ptrs, 0, sizeof(ptrs));
101 425 rhoads
   memset(size, 0, sizeof(size));
102 138 rhoads
   for(i = 0; i < 1000; ++i)
103
   {
104
      j = rand() & 255;
105
      if(ptrs[j])
106
      {
107
         ptr = ptrs[j];
108
         value = size[j];
109
         for(k = 0; k < value; ++k)
110
         {
111
            if(ptr[k] != value)
112 416 rhoads
            {
113 138 rhoads
               printf("Error\n");
114 416 rhoads
               break;
115
            }
116 138 rhoads
         }
117
         OS_HeapFree(ptrs[j]);
118
      }
119
      size[j] = (uint8)(rand() & 255);
120 416 rhoads
      ptrs[j] = (uint8*)OS_HeapMalloc(NULL, size[j]);
121 190 rhoads
      if(ptrs[j] == NULL)
122
         printf("malloc NULL\n");
123
      else
124
         memset(ptrs[j], size[j], size[j]);
125 138 rhoads
   }
126
   for(i = 0; i < 256; ++i)
127
   {
128
      if(ptrs[i])
129
         OS_HeapFree(ptrs[i]);
130
   }
131 400 rhoads
#if 1
132
   for(i = 1000; i < 1000000; i += 1000)
133
   {
134
      ptr = OS_HeapMalloc(NULL, i);
135
      if(ptr == NULL)
136
         break;
137
      OS_HeapFree(ptr);
138
   }
139
   printf("Malloc max = %d\n", i);
140
#endif
141 138 rhoads
   printf("Done.\n");
142
}
143
 
144
//******************************************************************
145 190 rhoads
static void MyThreadMain(void *arg)
146 138 rhoads
{
147
   OS_Thread_t *thread;
148
   int priority;
149
 
150
   thread = OS_ThreadSelf();
151
   priority = OS_ThreadPriorityGet(thread);
152
   OS_ThreadSleep(10);
153
   printf("Arg=%d thread=0x%x info=0x%x priority=%d\n",
154 407 rhoads
      (int)arg, (int)thread, (int)OS_ThreadInfoGet(thread, 0), priority);
155 190 rhoads
   OS_ThreadExit();
156 138 rhoads
}
157
 
158
static void TestThread(void)
159
{
160
   OS_Thread_t *thread;
161
   int i, priority;
162
 
163
   printf("TestThread\n");
164
   for(i = 0; i < 32; ++i)
165
   {
166
      priority = 50 + i;
167
      thread = OS_ThreadCreate("MyThread", MyThreadMain, (uint32*)i, priority, 0);
168 425 rhoads
      if(thread == NULL)
169
         return;
170 255 rhoads
      OS_ThreadInfoSet(thread, 0, (void*)(0xabcd + i));
171 138 rhoads
      //printf("Created thread 0x%x\n", thread);
172
   }
173
 
174
   thread = OS_ThreadSelf();
175
   priority = OS_ThreadPriorityGet(thread);
176
   printf("Priority = %d\n", priority);
177
   OS_ThreadPrioritySet(thread, 200);
178
   printf("Priority = %d\n", OS_ThreadPriorityGet(thread));
179
   OS_ThreadPrioritySet(thread, priority);
180
 
181
   printf("Thread time = %d\n", OS_ThreadTime());
182
   OS_ThreadSleep(100);
183
   printf("Thread time = %d\n", OS_ThreadTime());
184
}
185
 
186
//******************************************************************
187 190 rhoads
static void TestSemThread(void *arg)
188 138 rhoads
{
189
   int i;
190 190 rhoads
   TestInfo_t *info = (TestInfo_t*)arg;
191 138 rhoads
 
192 190 rhoads
   for(i = 0; i < SEMAPHORE_COUNT/2; ++i)
193 138 rhoads
   {
194
      printf("s");
195 190 rhoads
      OS_SemaphorePend(info->MySemaphore[i], OS_WAIT_FOREVER);
196
      OS_SemaphorePost(info->MySemaphore[i + SEMAPHORE_COUNT/2]);
197 138 rhoads
   }
198 190 rhoads
   OS_ThreadExit();
199 138 rhoads
}
200
 
201
static void TestSemaphore(void)
202
{
203
   int i, rc;
204 190 rhoads
   TestInfo_t info;
205 138 rhoads
   printf("TestSemaphore\n");
206 190 rhoads
   for(i = 0; i < SEMAPHORE_COUNT; ++i)
207 138 rhoads
   {
208 190 rhoads
      info.MySemaphore[i] = OS_SemaphoreCreate("MySem", 0);
209 138 rhoads
      //printf("sem[%d]=0x%x\n", i, MySemaphore[i]);
210
   }
211
 
212 190 rhoads
   OS_ThreadCreate("TestSem", TestSemThread, &info, 50, 0);
213 138 rhoads
 
214 190 rhoads
   for(i = 0; i < SEMAPHORE_COUNT/2; ++i)
215 138 rhoads
   {
216
      printf("S");
217 190 rhoads
      OS_SemaphorePost(info.MySemaphore[i]);
218
      rc = OS_SemaphorePend(info.MySemaphore[i + SEMAPHORE_COUNT/2], 500);
219 138 rhoads
      assert(rc == 0);
220
   }
221
 
222
   printf(":");
223 190 rhoads
   rc = OS_SemaphorePend(info.MySemaphore[0], 10);
224 138 rhoads
   assert(rc != 0);
225
   printf(":");
226 190 rhoads
   OS_SemaphorePend(info.MySemaphore[0], 100);
227 138 rhoads
   printf(":");
228
 
229 190 rhoads
   for(i = 0; i < SEMAPHORE_COUNT; ++i)
230
      OS_SemaphoreDelete(info.MySemaphore[i]);
231 138 rhoads
 
232
   printf("\nDone.\n");
233
}
234
 
235
//******************************************************************
236 190 rhoads
static void TestMutexThread(void *arg)
237 138 rhoads
{
238 190 rhoads
   TestInfo_t *info = (TestInfo_t*)arg;
239 138 rhoads
 
240
   printf("Waiting for mutex\n");
241 190 rhoads
   OS_MutexPend(info->MyMutex);
242 138 rhoads
   printf("Have Mutex1\n");
243 190 rhoads
   OS_MutexPend(info->MyMutex);
244 138 rhoads
   printf("Have Mutex2\n");
245 190 rhoads
   OS_MutexPend(info->MyMutex);
246 138 rhoads
   printf("Have Mutex3\n");
247
 
248
   OS_ThreadSleep(100);
249
 
250 190 rhoads
   OS_MutexPost(info->MyMutex);
251
   OS_MutexPost(info->MyMutex);
252
   OS_MutexPost(info->MyMutex);
253
 
254
   OS_ThreadExit();
255 138 rhoads
}
256
 
257 407 rhoads
//Test priority inversion
258
static void TestMutexThread2(void *arg)
259
{
260
   (void)arg;
261
   printf("Priority inversion test thread\n");
262
}
263
 
264 138 rhoads
static void TestMutex(void)
265
{
266 190 rhoads
   TestInfo_t info;
267 138 rhoads
   printf("TestMutex\n");
268 190 rhoads
   info.MyMutex = OS_MutexCreate("MyMutex");
269 425 rhoads
   if(info.MyMutex == NULL)
270
      return;
271 190 rhoads
   OS_MutexPend(info.MyMutex);
272
   OS_MutexPend(info.MyMutex);
273
   OS_MutexPend(info.MyMutex);
274 407 rhoads
   printf("Acquired mutexes\n");
275 138 rhoads
 
276 407 rhoads
   OS_ThreadCreate("TestMutex", TestMutexThread, &info, 150, 0);
277
   OS_ThreadCreate("TestMutex2", TestMutexThread2, &info, 110, 0);
278 138 rhoads
 
279 407 rhoads
   printf("Posting mutexes at priority %d\n",
280
      OS_ThreadPriorityGet(OS_ThreadSelf()));
281 190 rhoads
   OS_MutexPost(info.MyMutex);
282
   OS_MutexPost(info.MyMutex);
283
   OS_MutexPost(info.MyMutex);
284 407 rhoads
   printf("Thread priority %d\n", OS_ThreadPriorityGet(OS_ThreadSelf()));
285
   OS_ThreadSleep(50);
286 138 rhoads
 
287
   printf("Try get mutex\n");
288 190 rhoads
   OS_MutexPend(info.MyMutex);
289 407 rhoads
   printf("Got it\n");
290 138 rhoads
 
291 190 rhoads
   OS_MutexDelete(info.MyMutex);
292 407 rhoads
   OS_ThreadSleep(50);
293 138 rhoads
   printf("Done.\n");
294
}
295
 
296
//******************************************************************
297
static void TestMQueue(void)
298
{
299
   OS_MQueue_t *mqueue;
300
   char data[16];
301
   int i, rc;
302
 
303
   printf("TestMQueue\n");
304
   mqueue = OS_MQueueCreate("MyMQueue", 10, 16);
305 425 rhoads
   if(mqueue == NULL)
306
      return;
307 138 rhoads
   strcpy(data, "Test0");
308
   for(i = 0; i < 16; ++i)
309
   {
310
      data[4] = (char)('0' + i);
311
      OS_MQueueSend(mqueue, data);
312
   }
313
   for(i = 0; i < 16; ++i)
314
   {
315
      memset(data, 0, sizeof(data));
316
      rc = OS_MQueueGet(mqueue, data, 20);
317
      if(rc == 0)
318
         printf("message=(%s)\n", data);
319
      else
320
         printf("timeout\n");
321
   }
322
 
323
   OS_MQueueDelete(mqueue);
324
   printf("Done.\n");
325
}
326
 
327
//******************************************************************
328 190 rhoads
static void TestTimerThread(void *arg)
329 138 rhoads
{
330 190 rhoads
   int index;
331 138 rhoads
   uint32 data[4];
332
   OS_Timer_t *timer;
333 190 rhoads
   TestInfo_t *info = (TestInfo_t*)arg;
334 138 rhoads
 
335 190 rhoads
   //printf("TestTimerThread\n");
336
 
337
   OS_ThreadSleep(1);
338 255 rhoads
   index = (int)OS_ThreadInfoGet(OS_ThreadSelf(), 0);
339 190 rhoads
   //printf("index=%d\n", index);
340
   OS_MQueueGet(info->MyQueue[index], data, 1000);
341 138 rhoads
   timer = (OS_Timer_t*)data[1];
342
   printf("%d ", data[2]);
343 190 rhoads
   OS_MQueueGet(info->MyQueue[index], data, 1000);
344 138 rhoads
   printf("%d ", data[2]);
345 190 rhoads
   ++info->TimerDone;
346
   OS_ThreadExit();
347 138 rhoads
}
348
 
349
static void TestTimer(void)
350
{
351
   int i;
352 425 rhoads
   volatile TestInfo_t info;
353 138 rhoads
 
354
   printf("TestTimer\n");
355 190 rhoads
   info.TimerDone = 0;
356 138 rhoads
   for(i = 0; i < TIMER_COUNT; ++i)
357
   {
358 190 rhoads
      info.MyQueue[i] = OS_MQueueCreate("MyQueue", 10, 16);
359
      info.MyTimer[i] = OS_TimerCreate("MyTimer", info.MyQueue[i], i);
360 425 rhoads
      info.MyThread[i] = OS_ThreadCreate("TimerTest", TestTimerThread, (void*)&info, 50, 0);
361 255 rhoads
      OS_ThreadInfoSet(info.MyThread[i], 0, (void*)i);
362 190 rhoads
      OS_TimerStart(info.MyTimer[i], 10+i*2, 220+i);
363 138 rhoads
   }
364
 
365 190 rhoads
   while(info.TimerDone < TIMER_COUNT)
366 138 rhoads
      OS_ThreadSleep(10);
367
 
368
   for(i = 0; i < TIMER_COUNT; ++i)
369
   {
370 190 rhoads
      OS_MQueueDelete(info.MyQueue[i]);
371
      OS_TimerDelete(info.MyTimer[i]);
372 138 rhoads
   }
373
 
374
   printf("Done.\n");
375
}
376
 
377
//******************************************************************
378
#if 1
379
void TestMath(void)
380
{
381
   int i;
382
   float a, b, sum, diff, mult, div;
383
   uint32 compare;
384
 
385
   //Check add subtract multiply and divide
386
   for(i = -4; i < 4; ++i)
387
   {
388
      a = (float)(i * 10 + (float)63.2);
389
      b = (float)(-i * 5 + (float)3.5);
390
      sum = a + b;
391
      diff = a - b;
392
      mult = a * b;
393
      div = a / b;
394
      printf("a=%dE-3 b=%dE-3 sum=%dE-3 diff=%dE-3 mult=%dE-3 div=%dE-3\n",
395
         (int)(a*(float)1000), (int)(b*(float)1000),
396
         (int)(sum*(float)1000), (int)(diff*(float)1000),
397
         (int)(mult*(float)1000), (int)(div*(float)1000));
398
   }
399
 
400
   //Comparisons
401
   b = (float)2.0;
402
   compare = 0;
403
   for(i = 1; i < 4; ++i)
404
   {
405
      a = (float)i;
406
      compare = (compare << 1) | (a == b);
407
      compare = (compare << 1) | (a != b);
408
      compare = (compare << 1) | (a <  b);
409
      compare = (compare << 1) | (a <= b);
410
      compare = (compare << 1) | (a >  b);
411
      compare = (compare << 1) | (a >= b);
412
   }
413
   printf("Compare = %8x %s\n", compare,
414
      compare==0x1c953 ? "OK" : "ERROR");
415
 
416
   //Cosine
417
   for(a = (float)0.0; a <= (float)(3.1415); a += (float)(3.1415/16.0))
418
   {
419
      b = FP_Cos(a);
420
      printf("cos(%4dE-3) = %4dE-3\n",
421
         (int)(a*(float)1000.0), (int)(b*(float)1000.0));
422
   }
423
}
424
#endif
425
 
426 194 rhoads
//******************************************************************
427 402 rhoads
#if OS_CPU_COUNT > 1
428
int SpinDone;
429
void ThreadSpin(void *arg)
430
{
431
   int i;
432
   int j = 0;
433 407 rhoads
   unsigned int state;
434 402 rhoads
   unsigned int timeStart = OS_ThreadTime();
435
 
436
   for(i = 0; i < 0x10000000; ++i)
437
   {
438 407 rhoads
      if((i & 0xff) == 0)
439
      {
440
         state = OS_CriticalBegin();
441
         j += i;
442
         OS_CriticalEnd(state);
443
      }
444 402 rhoads
      if(OS_ThreadTime() - timeStart > 400)
445
         break;
446
      if((i & 0xfffff) == 0)
447
         printf("[%d] ", (int)arg);
448
   }
449
   printf("done[%d].\n", (int)arg);
450
   ++SpinDone;
451
}
452
 
453
void TestSpin(void)
454
{
455
   int i;
456
   SpinDone = 0;
457
   for(i = 0; i < OS_CPU_COUNT; ++i)
458
      OS_ThreadCreate("Spin", ThreadSpin, (void*)i, 50+i, 0);
459
   for(i = 0; i < 100 && SpinDone < OS_CPU_COUNT; ++i)
460
      OS_ThreadSleep(1);
461
}
462
#endif
463
 
464
//******************************************************************
465 194 rhoads
#ifndef WIN32
466
static void MySyscall(void *arg)
467
{
468
   uint32 *stack = arg;
469
   stack[STACK_EPC] += 4;  //skip over SYSCALL
470
   printf("Inside MySyscall %d\n", stack[28/4]);
471
}
472
 
473
void TestSyscall(void)
474
{
475
   OS_InterruptRegister((uint32)(1<<31), MySyscall);
476
   OS_Syscall(57);
477
   OS_ThreadSleep(1);
478
   printf("Done\n");
479
}
480
#endif
481
 
482 190 rhoads
#ifdef __MMU_ENUM_H__
483
void TestProcess(void)
484
{
485
   OS_Process_t *process;
486
   process = (OS_Process_t*)OS_HeapMalloc(NULL, sizeof(OS_Process_t));
487
   process->name = "test";
488
   process->funcPtr = MainThread;
489
   process->arg = NULL;
490
   process->priority = 200;
491
   process->stackSize = 1024*32;
492
   process->heapSize = 1024*128;
493
   process->processId = 1;
494
   process->semaphoreDone = OS_SemaphoreCreate("processDone", 0);
495
   printf("Creating process\n");
496
   OS_MMUProcessCreate(process);
497
   OS_SemaphorePend(process->semaphoreDone, OS_WAIT_FOREVER);
498
   printf("Process done\n");
499
   OS_MMUProcessDelete(process);
500
}
501
#endif
502 138 rhoads
 
503 190 rhoads
 
504 138 rhoads
//******************************************************************
505 190 rhoads
void MMUTest(void);
506 221 rhoads
void HtmlThread(void *arg);
507
void ConsoleInit(void);
508 336 rhoads
uint8 macAddress[] =  {0x00, 0x10, 0xdd, 0xce, 0x15, 0xd4};
509 221 rhoads
 
510 298 rhoads
 
511 138 rhoads
void MainThread(void *Arg)
512
{
513 283 rhoads
   int ch, i, display=1;
514 138 rhoads
   (void)Arg;
515 190 rhoads
#ifdef __MMU_ENUM_H__
516
   OS_MMUInit();
517
#endif
518 138 rhoads
 
519 298 rhoads
#ifdef INCLUDE_ETH
520
   EthernetInit(macAddress);
521
   IPInit(EthernetTransmit, macAddress, "plasma");
522
   HtmlInit(1);
523
#endif
524
 
525 416 rhoads
#ifdef INCLUDE_UART_PACKETS
526 298 rhoads
   IPInit(NULL, macAddress, "plasma");
527 235 rhoads
   HtmlInit(1);
528 221 rhoads
#endif
529
 
530 416 rhoads
#if !defined(EXCLUDE_CONSOLE) && (defined(INCLUDE_ETH) || defined(INCLUDE_UART_PACKETS))
531 221 rhoads
   ConsoleInit();
532
#endif
533
 
534 138 rhoads
   for(;;)
535
   {
536 283 rhoads
      if(display)
537
      {
538
         printf("\n");
539
         printf("1 CLib\n");
540
         printf("2 Heap\n");
541
         printf("3 Thread\n");
542
         printf("4 Semaphore\n");
543
         printf("5 Mutex\n");
544
         printf("6 MQueue\n");
545
         printf("7 Timer\n");
546
         printf("8 Math\n");
547
         printf("9 Syscall\n");
548 190 rhoads
#ifdef __MMU_ENUM_H__
549 283 rhoads
         printf("p MMU Process\n");
550 190 rhoads
#endif
551 283 rhoads
      }
552 138 rhoads
      printf("> ");
553 283 rhoads
      display = 1;
554 138 rhoads
      ch = UartRead();
555
      printf("%c\n", ch);
556
      switch(ch)
557
      {
558 255 rhoads
#ifdef WIN32
559
      case '0': exit(0);
560
#endif
561 138 rhoads
      case '1': TestCLib(); break;
562
      case '2': TestHeap(); break;
563
      case '3': TestThread(); break;
564
      case '4': TestSemaphore(); break;
565
      case '5': TestMutex(); break;
566
      case '6': TestMQueue(); break;
567
      case '7': TestTimer(); break;
568
      case '8': TestMath(); break;
569 190 rhoads
#ifndef WIN32
570 194 rhoads
      case '9': TestSyscall(); break;
571 190 rhoads
#endif
572
#ifdef __MMU_ENUM_H__
573
      case 'p': TestProcess(); break;
574
#endif
575 138 rhoads
#ifdef WIN32
576
      case 'm': TestMathFull(); break;
577
#endif
578 190 rhoads
      case 'g': printf("Global=%d\n", ++Global); break;
579 402 rhoads
#if OS_CPU_COUNT > 1
580
      case 's': TestSpin(); break;
581
#endif
582 235 rhoads
      default:
583 283 rhoads
         printf("E");
584
         display = 0;
585 235 rhoads
         for(i = 0; i < 30; ++i)
586
         {
587 402 rhoads
            while(OS_kbhit())
588 235 rhoads
               ch = UartRead();
589 275 rhoads
            OS_ThreadSleep(1);
590 235 rhoads
         }
591
         break;
592 138 rhoads
      }
593
   }
594
}
595
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.