You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.2 KiB
84 lines
1.2 KiB
#include <stdint.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <stdio.h> |
|
|
|
#include "sim_vhpi_c.h" |
|
|
|
struct int_bounds |
|
{ |
|
int left; |
|
int right; |
|
char dir; |
|
unsigned int len; |
|
}; |
|
|
|
struct fat_pointer |
|
{ |
|
void *base; |
|
struct int_bounds *bounds; |
|
}; |
|
|
|
char *from_string(void *__p) |
|
{ |
|
struct fat_pointer *p = __p; |
|
unsigned long len = p->bounds->len; |
|
char *m; |
|
|
|
m = malloc(len+1); |
|
if (!m) { |
|
perror("malloc"); |
|
exit(1); |
|
} |
|
|
|
memcpy(m, p->base, len); |
|
m[len] = 0x0; |
|
|
|
return m; |
|
} |
|
|
|
uint64_t from_std_logic_vector(unsigned char *p, unsigned long len) |
|
{ |
|
unsigned long ret = 0; |
|
|
|
if (len > 64) { |
|
fprintf(stderr, "%s: invalid length %lu\n", __func__, len); |
|
exit(1); |
|
} |
|
|
|
for (unsigned long i = 0; i < len; i++) { |
|
unsigned char bit; |
|
|
|
if (*p == vhpi0) { |
|
bit = 0; |
|
} else if (*p == vhpi1) { |
|
bit = 1; |
|
} else { |
|
fprintf(stderr, "%s: bad bit %d\n", __func__, *p); |
|
bit = 0; |
|
} |
|
|
|
ret = (ret << 1) | bit; |
|
p++; |
|
} |
|
|
|
return ret; |
|
} |
|
|
|
void to_std_logic_vector(unsigned long val, unsigned char *p, |
|
unsigned long len) |
|
{ |
|
if (len > 64) { |
|
fprintf(stderr, "%s: invalid length %lu\n", __func__, len); |
|
exit(1); |
|
} |
|
|
|
for (unsigned long i = 0; i < len; i++) { |
|
if ((val >> (len-1-i) & 1)) |
|
*p = vhpi1; |
|
else |
|
*p = vhpi0; |
|
|
|
p++; |
|
} |
|
}
|
|
|