sim_vhpi_c.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <stdint.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include "sim_vhpi_c.h"
  6. struct int_bounds
  7. {
  8. int left;
  9. int right;
  10. char dir;
  11. unsigned int len;
  12. };
  13. struct fat_pointer
  14. {
  15. void *base;
  16. struct int_bounds *bounds;
  17. };
  18. char *from_string(void *__p)
  19. {
  20. struct fat_pointer *p = __p;
  21. unsigned long len = p->bounds->len;
  22. char *m;
  23. m = malloc(len+1);
  24. if (!m) {
  25. perror("malloc");
  26. exit(1);
  27. }
  28. memcpy(m, p->base, len);
  29. m[len] = 0x0;
  30. return m;
  31. }
  32. uint64_t from_std_logic_vector(unsigned char *p, unsigned long len)
  33. {
  34. unsigned long ret = 0;
  35. if (len > 64) {
  36. fprintf(stderr, "%s: invalid length %lu\n", __func__, len);
  37. exit(1);
  38. }
  39. for (unsigned long i = 0; i < len; i++) {
  40. unsigned char bit;
  41. if (*p == vhpi0) {
  42. bit = 0;
  43. } else if (*p == vhpi1) {
  44. bit = 1;
  45. } else {
  46. fprintf(stderr, "%s: bad bit %d\n", __func__, *p);
  47. bit = 0;
  48. }
  49. ret = (ret << 1) | bit;
  50. p++;
  51. }
  52. return ret;
  53. }
  54. void to_std_logic_vector(unsigned long val, unsigned char *p,
  55. unsigned long len)
  56. {
  57. if (len > 64) {
  58. fprintf(stderr, "%s: invalid length %lu\n", __func__, len);
  59. exit(1);
  60. }
  61. for (unsigned long i = 0; i < len; i++) {
  62. if ((val >> (len-1-i) & 1))
  63. *p = vhpi1;
  64. else
  65. *p = vhpi0;
  66. p++;
  67. }
  68. }