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

Subversion Repositories igor

[/] [igor/] [trunk/] [simulator/] [object.c] - Rev 4

Compare with Previous | Blame | View Log

#include <stdio.h>
#include <err.h>
 
#include "object.h"
#include "debug.h"
#include "bits.h"
 
void
object_dump(reg_t object)
{
	struct di_const *c;
	char *type;
 
	c = debug_get1_filter(OBJECT_TYPE(object), "type");
	if (c == NULL)
		type = "unknown";
	else
		type = c->name;
 
	printf("Object %s: 0x%x, gc bit: %d\n", type, OBJECT_DATUM(object), OBJECT_GC(object));
	puts("datum");
	debug_show(OBJECT_DATUM(object));
}
 
reg_t
object_set_field(reg_t object, uint32_t value, uint32_t offset, uint32_t mask)
{
	object &= ~(mask<<offset);
	object |= (value&mask)<<offset;
	return object;
}
 
reg_t
object_get_type(reg_t object)
{
	return OBJECT_TYPE(object);
}
 
reg_t
object_set_type(reg_t object, uint8_t type)
{
	return object_set_field(object, type,
				OBJECT_TYPE_OFFSET,
				OBJECT_TYPE_MASK);
}
 
reg_t
object_get_datum(reg_t object)
{
	return OBJECT_DATUM(object);
}
 
reg_t
object_get_datum_signed(reg_t object)
{
	return sign_extend(OBJECT_DATUM(object), 26);
}
 
reg_t
object_set_datum(reg_t object, uint32_t datum)
{
	return object_set_field(object, datum,
				OBJECT_DATUM_OFFSET,
				OBJECT_DATUM_MASK);
}
 
reg_t
object_get_gc(reg_t object)
{
	return OBJECT_GC(object);
}
 
reg_t
object_set_gc(reg_t object, uint32_t gc)
{
	return object_set_field(object, gc,
				OBJECT_GC_OFFSET,
				OBJECT_GC_MASK);
}
 
 
reg_t
object_make(uint8_t type, uint32_t datum)
{
	reg_t obj = 0;
	obj = object_set_type(obj, type);
	obj = object_set_datum(obj, datum);
	return obj;
}
 
 
void
object_serialize(reg_t obj, uint8_t *buf)
{
	buf[0] = (obj>>24) & 0xFF;
	buf[1] = (obj>>16) & 0xFF;
	buf[2] = (obj>>8)  & 0xFF;
	buf[3] =  obj      & 0xFF;
}
 
reg_t
object_deserialize(uint8_t *buf)
{
	return (buf[0]<<24) | (buf[1]<<16) | (buf[2]<<8) | buf[3];
}
 
int
object_read(reg_t *objects, int length, FILE *f)
{
	uint8_t buf[4];
	int i;
	for (i = 0; i < length; i++) {
		if (fread(buf, 4, 1, f) != 1) {
			warn("Read failed");
			return i;
		}
		objects[i] = object_deserialize(buf);
	}
	return length;
}
 
int
object_write(reg_t *objects, int length, FILE *f)
{
	uint8_t buf[4];
	int i;
	for (i = 0; i < length; i++) {
		object_serialize(objects[i], buf);
		if (fwrite(buf, 4, 1, f) != 1)
			return i;
	}
	return length;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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