#ifndef GSIM_H
#define GSIM_H
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#if defined(__GNUC__) && (__GNUC__ >= 4)
#define GSIM_MUST_USE __attribute__ ((warn_unused_result))
#elif defined(_MSC_VER) && (_MSC_VER >= 1700)
#define GSIM_MUST_USE _Check_return_
#else
#define GSIM_MUST_USE
#endif
#define INVALID_WIRE_ID 0xFFFFFFFF
#define INVALID_COMPONENT_ID 0xFFFFFFFF
#define GSIM_RESULT_SUCCESS 0
#define GSIM_RESULT_MAX_STEPS_REACHED 1
#define GSIM_RESULT_FALSE 0
#define GSIM_RESULT_TRUE 1
#define GSIM_RESULT_HIGH_Z 0
#define GSIM_RESULT_UNDEFINED 1
#define GSIM_RESULT_LOGIC_0 2
#define GSIM_RESULT_LOGIC_1 3
#define GSIM_RESULT_NULL_POINTER -0x0000_0001
#define GSIM_RESULT_POINTER_MISALIGNED -0x0000_0002
#define GSIM_RESULT_INVALID_ARGUMENT -0x0000_0003
#define GSIM_RESULT_ARGUMENT_OUT_OF_RANGE -0x0000_0004
#define GSIM_RESULT_UTF8_ENCODING -0x0000_0005
#define GSIM_RESULT_IO -0x0000_0006
#define GSIM_RESULT_INVALID_OPERATION -0x0000_0007
#define GSIM_RESULT_RESOURCE_LIMIT_REACHED -0x0001_0001
#define GSIM_RESULT_WIRE_WIDTH_MISMATCH -0x0001_0002
#define GSIM_RESULT_WIRE_WIDTH_INCOMPATIBLE -0x0001_0003
#define GSIM_RESULT_OFFSET_OUT_OF_RANGE -0x0001_0004
#define GSIM_RESULT_TOO_FEW_INPUTS -0x0001_0005
#define GSIM_RESULT_INVALID_INPUT_COUNT -0x0001_0006
#define GSIM_RESULT_INVALID_COMPONENT_TYPE -0x0001_0007
#define GSIM_RESULT_CONFLICT -0x0002_0001
#define GSIM_RESULT_INVALID_WIRE_ID -0x0002_0002
#define GSIM_RESULT_INVALID_COMPONENT_ID -0x0002_0003
#define GSIM_RESULT_MALFORMED_FORMAT -0x0003_0001
#define GSIM_RESULT_UNSUPPORTED -0x0003_0002
typedef struct LogicState LogicState;
typedef struct Builder Builder;
typedef struct Simulator Simulator;
typedef int32_t GsimResult;
typedef uint32_t WireId;
typedef uint32_t ComponentId;
typedef struct PortList {
size_t len;
const char *const *names;
const WireId *wires;
} PortList;
typedef struct SimulationErrors {
size_t conflicts_len;
const WireId *conflicts;
} SimulationErrors;
GSIM_MUST_USE GsimResult string_free(const char *s);
GSIM_MUST_USE
GsimResult builder_new(Builder **builder);
GSIM_MUST_USE GsimResult builder_write_dot(const Builder *builder, const char *dot_file);
GSIM_MUST_USE
GsimResult builder_get_wire_width(const Builder *builder,
WireId wire,
uint8_t *width);
GSIM_MUST_USE
GsimResult builder_set_wire_drive(Builder *builder,
WireId wire,
const LogicState *drive);
GSIM_MUST_USE
GsimResult builder_get_wire_drive(const Builder *builder,
WireId wire,
const LogicState **drive);
GSIM_MUST_USE
GsimResult builder_get_register_width(const Builder *builder,
ComponentId register_,
uint8_t *width);
GSIM_MUST_USE
GsimResult builder_read_register_state(const Builder *builder,
ComponentId register_,
const LogicState **state);
GSIM_MUST_USE
GsimResult builder_write_register_state(Builder *builder,
ComponentId register_,
const LogicState *state);
GSIM_MUST_USE
GsimResult builder_get_memory_metrics(const Builder *builder,
ComponentId memory,
size_t *size,
uint8_t *width);
GSIM_MUST_USE
GsimResult builder_read_memory_state(const Builder *builder,
ComponentId memory,
size_t addr,
const LogicState **state);
GSIM_MUST_USE
GsimResult builder_write_memory_state(Builder *builder,
ComponentId memory,
size_t addr,
const LogicState *state);
GSIM_MUST_USE GsimResult builder_set_wire_name(Builder *builder, WireId wire, const char *name);
GSIM_MUST_USE
GsimResult builder_get_wire_name(const Builder *builder,
WireId wire,
const char **name);
GSIM_MUST_USE
GsimResult builder_set_component_name(Builder *builder,
ComponentId component,
const char *name);
GSIM_MUST_USE
GsimResult builder_get_component_name(const Builder *builder,
ComponentId component,
const char **name);
GSIM_MUST_USE GsimResult builder_add_wire(Builder *builder, uint8_t width, WireId *wire);
GSIM_MUST_USE
GsimResult builder_add_and_gate(Builder *builder,
const WireId *inputs,
size_t input_len,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_or_gate(Builder *builder,
const WireId *inputs,
size_t input_len,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_xor_gate(Builder *builder,
const WireId *inputs,
size_t input_len,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_nand_gate(Builder *builder,
const WireId *inputs,
size_t input_len,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_nor_gate(Builder *builder,
const WireId *inputs,
size_t input_len,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_xnor_gate(Builder *builder,
const WireId *inputs,
size_t input_len,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_merge(Builder *builder,
const WireId *inputs,
size_t input_len,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_priority_decoder(Builder *builder,
const WireId *inputs,
size_t input_len,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_buffer(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_add(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_sub(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_mul(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_left_shift(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_logical_right_shift(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_arithmetic_right_shift(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_equal(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_not_equal(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_less_than(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_greater_than(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_less_than_or_equal(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_greater_than_or_equal(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_less_than_signed(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_greater_than_signed(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_less_than_or_equal_signed(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_compare_greater_than_or_equal_signed(Builder *builder,
WireId input_a,
WireId input_b,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_not_gate(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_neg(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_horizontal_and_gate(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_horizontal_or_gate(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_horizontal_xor_gate(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_horizontal_nand_gate(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_horizontal_nor_gate(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_horizontal_xnor_gate(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_zero_extend(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_sign_extend(Builder *builder,
WireId input,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_slice(Builder *builder,
WireId input,
uint8_t offset,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_adder(Builder *builder,
WireId input_a,
WireId input_b,
WireId carry_in,
WireId output,
WireId carry_out,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_multiplexer(Builder *builder,
const WireId *inputs,
size_t input_len,
WireId select,
WireId output,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_register(Builder *builder,
WireId data_in,
WireId data_out,
WireId enable,
WireId clock,
uint8_t clock_polarity,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_ram(Builder *builder,
WireId write_addr,
WireId data_in,
WireId read_addr,
WireId data_out,
WireId write,
WireId clock,
uint8_t clock_polarity,
ComponentId *component);
GSIM_MUST_USE
GsimResult builder_add_rom(Builder *builder,
WireId addr,
WireId data,
ComponentId *component);
GSIM_MUST_USE GsimResult port_list_free(struct PortList port_list);
GSIM_MUST_USE
GsimResult builder_import_yosys_module(Builder *builder,
const char *json_file,
struct PortList *inputs,
struct PortList *outputs);
GSIM_MUST_USE const LogicState *logic_state_high_z(void);
GSIM_MUST_USE const LogicState *logic_state_undefined(void);
GSIM_MUST_USE const LogicState *logic_state_logic_0(void);
GSIM_MUST_USE const LogicState *logic_state_logic_1(void);
GSIM_MUST_USE const LogicState *logic_state_from_int(uint32_t value);
GSIM_MUST_USE
GsimResult logic_state_from_big_int(const uint32_t *value,
size_t word_len,
const LogicState **state);
GSIM_MUST_USE
GsimResult logic_state_parse(const char *s,
const LogicState **state);
GSIM_MUST_USE
GsimResult logic_state_clone(const LogicState *state,
const LogicState **clone);
GSIM_MUST_USE
GsimResult logic_state_to_int(const LogicState *state,
uint8_t width,
uint32_t *value);
GSIM_MUST_USE
GsimResult logic_state_to_big_int(const LogicState *state,
uint8_t width,
uint32_t *value);
GSIM_MUST_USE
GsimResult logic_state_get_bit_state(const LogicState *state,
uint8_t bit_index);
GSIM_MUST_USE
GsimResult logic_state_print(const LogicState *state,
uint8_t width,
char *buffer);
GSIM_MUST_USE GsimResult logic_state_eq(const LogicState *a, const LogicState *b, uint8_t width);
GSIM_MUST_USE GsimResult logic_state_free(LogicState *state);
GSIM_MUST_USE
GsimResult simulator_build(Builder **builder,
struct Simulator **simulator);
GSIM_MUST_USE
GsimResult simulator_build_with_trace(Builder **builder,
const char *trace_file,
const struct Simulator **simulator);
GSIM_MUST_USE
GsimResult simulator_write_dot(const struct Simulator *simulator,
const char *dot_file,
uint8_t show_states);
GSIM_MUST_USE
GsimResult simulator_get_wire_width(const struct Simulator *simulator,
WireId wire,
uint8_t *width);
GSIM_MUST_USE
GsimResult simulator_set_wire_drive(struct Simulator *simulator,
WireId wire,
const LogicState *drive);
GSIM_MUST_USE
GsimResult simulator_get_wire_drive(const struct Simulator *simulator,
WireId wire,
const LogicState **drive);
GSIM_MUST_USE
GsimResult simulator_get_wire_state(const struct Simulator *simulator,
WireId wire,
const LogicState **state);
GSIM_MUST_USE
GsimResult simulator_get_register_width(const struct Simulator *simulator,
ComponentId register_,
uint8_t *width);
GSIM_MUST_USE
GsimResult simulator_read_register_state(const struct Simulator *simulator,
ComponentId register_,
const LogicState **state);
GSIM_MUST_USE
GsimResult simulator_write_register_state(struct Simulator *simulator,
ComponentId register_,
const LogicState *state);
GSIM_MUST_USE
GsimResult simulator_get_memory_metrics(const struct Simulator *simulator,
ComponentId memory,
size_t *size,
uint8_t *width);
GSIM_MUST_USE
GsimResult simulator_read_memory_state(const struct Simulator *simulator,
ComponentId memory,
size_t addr,
const LogicState **state);
GSIM_MUST_USE
GsimResult simulator_write_memory_state(struct Simulator *simulator,
ComponentId memory,
size_t addr,
const LogicState *state);
GSIM_MUST_USE
GsimResult simulator_get_wire_name(struct Simulator *simulator,
WireId wire,
const char **name);
GSIM_MUST_USE
GsimResult simulator_get_component_name(struct Simulator *simulator,
ComponentId component,
const char **name);
GSIM_MUST_USE GsimResult simulator_reset(struct Simulator *simulator);
GSIM_MUST_USE
GsimResult simulation_errors_free(struct SimulationErrors error);
GSIM_MUST_USE
GsimResult simulator_run_sim(struct Simulator *simulator,
uint64_t max_steps,
struct SimulationErrors *errors);
GSIM_MUST_USE
GsimResult simulator_trace(struct Simulator *simulator,
uint64_t time);
GSIM_MUST_USE GsimResult simulator_free(struct Simulator *simulator);
#endif