Paul Pan
7b33e4213a
1. add test soft 2. modify verilator (TODO: crossbar need to replace) 3. fix CP0: now CU0 is always 1 4. Controller: cacheop 5. Controller: fix TEN 6. mycpu_top fix CP0_i 7. fix AXI.sv 8. fix AXIReader.sv 9. fix AXIWriter.sv: getting the correct data and length 10. MU: fix cache writeback, fix mem data mux, fix writer address, fix read request
225 lines
3.4 KiB
C
225 lines
3.4 KiB
C
static char * _getbase __P((char *, int *));
|
|
#ifdef HAVE_QUAD
|
|
static int _atob __P((unsigned long long *, char *p, int));
|
|
#else
|
|
static int _atob __P((unsigned long *, char *, int));
|
|
#endif
|
|
|
|
static char *
|
|
_getbase(char *p, int *basep)
|
|
{
|
|
if (p[0] == '0') {
|
|
switch (p[1]) {
|
|
case 'x':
|
|
*basep = 16;
|
|
break;
|
|
case 't': case 'n':
|
|
*basep = 10;
|
|
break;
|
|
case 'o':
|
|
*basep = 8;
|
|
break;
|
|
default:
|
|
*basep = 10;
|
|
return (p);
|
|
}
|
|
return (p + 2);
|
|
}
|
|
*basep = 10;
|
|
return (p);
|
|
}
|
|
|
|
|
|
/*
|
|
* _atob(vp,p,base)
|
|
*/
|
|
static int
|
|
#ifdef HAVE_QUAD
|
|
_atob (u_quad_t *vp, char *p, int base)
|
|
{
|
|
u_quad_t value, v1, v2;
|
|
#else
|
|
_atob (unsigned long *vp, char *p, int base)
|
|
{
|
|
u_long value, v1, v2;
|
|
#endif
|
|
char *q, tmp[20];
|
|
int digit;
|
|
|
|
if (p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {
|
|
base = 16;
|
|
p += 2;
|
|
}
|
|
|
|
if (base == 16 && (q = strchr (p, '.')) != 0) {
|
|
if (q - p > sizeof(tmp) - 1)
|
|
return (0);
|
|
|
|
strncpy (tmp, p, q - p);
|
|
tmp[q - p] = '\0';
|
|
if (!_atob (&v1, tmp, 16))
|
|
return (0);
|
|
|
|
q++;
|
|
if (strchr (q, '.'))
|
|
return (0);
|
|
|
|
if (!_atob (&v2, q, 16))
|
|
return (0);
|
|
*vp = (v1 << 16) + v2;
|
|
return (1);
|
|
}
|
|
|
|
value = *vp = 0;
|
|
for (; *p; p++) {
|
|
if (*p >= '0' && *p <= '9')
|
|
digit = *p - '0';
|
|
else if (*p >= 'a' && *p <= 'f')
|
|
digit = *p - 'a' + 10;
|
|
else if (*p >= 'A' && *p <= 'F')
|
|
digit = *p - 'A' + 10;
|
|
else
|
|
return (0);
|
|
|
|
if (digit >= base)
|
|
return (0);
|
|
value *= base;
|
|
value += digit;
|
|
}
|
|
*vp = value;
|
|
return (1);
|
|
}
|
|
|
|
/*
|
|
* atob(vp,p,base)
|
|
* converts p to binary result in vp, rtn 1 on success
|
|
*/
|
|
int
|
|
atob(uint32_t *vp, char *p, int base)
|
|
{
|
|
#ifdef HAVE_QUAD
|
|
u_quad_t v;
|
|
#else
|
|
u_long v;
|
|
#endif
|
|
|
|
if (base == 0)
|
|
p = _getbase (p, &base);
|
|
if (_atob (&v, p, base)) {
|
|
*vp = v;
|
|
return (1);
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
|
|
#ifdef HAVE_QUAD
|
|
/*
|
|
* llatob(vp,p,base)
|
|
* converts p to binary result in vp, rtn 1 on success
|
|
*/
|
|
int
|
|
llatob(u_quad_t *vp, char *p, int base)
|
|
{
|
|
if (base == 0)
|
|
p = _getbase (p, &base);
|
|
return _atob(vp, p, base);
|
|
}
|
|
#endif
|
|
|
|
|
|
/*
|
|
* char *btoa(dst,value,base)
|
|
* converts value to ascii, result in dst
|
|
*/
|
|
char *
|
|
btoa(char *dst, u_int value, int base)
|
|
{
|
|
char buf[34], digit;
|
|
int i, j, rem, neg;
|
|
|
|
if (value == 0) {
|
|
dst[0] = '0';
|
|
dst[1] = 0;
|
|
return (dst);
|
|
}
|
|
|
|
neg = 0;
|
|
if (base == -10) {
|
|
base = 10;
|
|
if (value & (1L << 31)) {
|
|
value = (~value) + 1;
|
|
neg = 1;
|
|
}
|
|
}
|
|
|
|
for (i = 0; value != 0; i++) {
|
|
rem = value % base;
|
|
value /= base;
|
|
if (rem >= 0 && rem <= 9)
|
|
digit = rem + '0';
|
|
else if (rem >= 10 && rem <= 36)
|
|
digit = (rem - 10) + 'a';
|
|
buf[i] = digit;
|
|
}
|
|
|
|
buf[i] = 0;
|
|
if (neg)
|
|
strcat (buf, "-");
|
|
|
|
/* reverse the string */
|
|
for (i = 0, j = strlen (buf) - 1; j >= 0; i++, j--)
|
|
dst[i] = buf[j];
|
|
dst[i] = 0;
|
|
return (dst);
|
|
}
|
|
|
|
#ifdef HAVE_QUAD
|
|
/*
|
|
* char *btoa(dst,value,base)
|
|
* converts value to ascii, result in dst
|
|
*/
|
|
char *
|
|
llbtoa(char *dst, u_quad_t value, int base)
|
|
{
|
|
char buf[66], digit;
|
|
int i, j, rem, neg;
|
|
|
|
if (value == 0) {
|
|
dst[0] = '0';
|
|
dst[1] = 0;
|
|
return (dst);
|
|
}
|
|
|
|
neg = 0;
|
|
if (base == -10) {
|
|
base = 10;
|
|
if (value & (1LL << 63)) {
|
|
value = (~value) + 1;
|
|
neg = 1;
|
|
}
|
|
}
|
|
|
|
for (i = 0; value != 0; i++) {
|
|
rem = value % base;
|
|
value /= base;
|
|
if (rem >= 0 && rem <= 9)
|
|
digit = rem + '0';
|
|
else if (rem >= 10 && rem <= 36)
|
|
digit = (rem - 10) + 'a';
|
|
buf[i] = digit;
|
|
}
|
|
|
|
buf[i] = 0;
|
|
if (neg)
|
|
strcat (buf, "-");
|
|
|
|
/* reverse the string */
|
|
for (i = 0, j = strlen (buf) - 1; j >= 0; i++, j--)
|
|
dst[i] = buf[j];
|
|
dst[i] = 0;
|
|
return (dst);
|
|
}
|
|
#endif
|
|
|