You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			85 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
#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++;
 | 
						|
	}
 | 
						|
}
 |