📄 ghwlib.h
字号:
/* GHDL Wavefile reader library. Copyright (C) 2005 Tristan Gingold GHDL is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GHDL is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.*/#ifndef _GHWLIB_H_#define _GHWLIB_H_#include <stdio.h>#include <stdint.h>#include <stdlib.h>enum ghdl_rtik { ghdl_rtik_top, /* 0 */ ghdl_rtik_library, ghdl_rtik_package, ghdl_rtik_package_body, ghdl_rtik_entity, ghdl_rtik_architecture, /* 5 */ ghdl_rtik_process, ghdl_rtik_block, ghdl_rtik_if_generate, ghdl_rtik_for_generate, ghdl_rtik_instance, ghdl_rtik_constant, ghdl_rtik_iterator, ghdl_rtik_variable, ghdl_rtik_signal, ghdl_rtik_file, ghdl_rtik_port, ghdl_rtik_generic, ghdl_rtik_alias, ghdl_rtik_guard, ghdl_rtik_component, ghdl_rtik_attribute, ghdl_rtik_type_b2, /* 22 */ ghdl_rtik_type_e8, ghdl_rtik_type_e32, ghdl_rtik_type_i32, /* 25 */ ghdl_rtik_type_i64, ghdl_rtik_type_f64, ghdl_rtik_type_p32, ghdl_rtik_type_p64, ghdl_rtik_type_access, /* 30 */ ghdl_rtik_type_array, ghdl_rtik_type_record, ghdl_rtik_type_file, ghdl_rtik_subtype_scalar, ghdl_rtik_subtype_array, /* 35 */ ghdl_rtik_subtype_array_ptr, ghdl_rtik_subtype_unconstrained_array, ghdl_rtik_subtype_record, ghdl_rtik_subtype_access, ghdl_rtik_type_protected, ghdl_rtik_element, ghdl_rtik_unit, ghdl_rtik_attribute_transaction, ghdl_rtik_attribute_quiet, ghdl_rtik_attribute_stable, ghdl_rtik_error};/* Well-known types. */enum ghw_wkt_type { ghw_wkt_unknown, ghw_wkt_boolean, ghw_wkt_bit, ghw_wkt_std_ulogic};struct ghw_range_e8{ enum ghdl_rtik kind : 8; int dir : 8; /* 0: to, !0: downto. */ unsigned char left; unsigned char right;};struct ghw_range_i32{ enum ghdl_rtik kind : 8; int dir : 8; /* 0: to, !0: downto. */ int32_t left; int32_t right;};struct ghw_range_i64{ enum ghdl_rtik kind : 8; int dir : 8; int64_t left; int64_t right;};struct ghw_range_f64{ enum ghdl_rtik kind : 8; int dir : 8; double left; double right;};union ghw_range{ enum ghdl_rtik kind : 8; struct ghw_range_e8 e8; struct ghw_range_i32 i32; struct ghw_range_i64 i64; struct ghw_range_f64 f64;};/* Note: the first two fields must be kind and name. */union ghw_type;struct ghw_type_common{ enum ghdl_rtik kind; const char *name;};struct ghw_type_enum{ enum ghdl_rtik kind; const char *name; enum ghw_wkt_type wkt; int nbr; const char **lits;};struct ghw_type_scalar{ enum ghdl_rtik kind; const char *name;};struct ghw_unit{ const char *name; int64_t val;};struct ghw_type_physical{ enum ghdl_rtik kind; const char *name; uint32_t nbr_units; struct ghw_unit *units;};struct ghw_type_array{ enum ghdl_rtik kind; const char *name; int nbr_dim; union ghw_type *el; union ghw_type **dims;};struct ghw_subtype_array{ enum ghdl_rtik kind; const char *name; struct ghw_type_array *base; int nbr_el; union ghw_range **rngs;};struct ghw_subtype_scalar{ enum ghdl_rtik kind; const char *name; union ghw_type *base; union ghw_range *rng;};struct ghw_record_element{ const char *name; union ghw_type *type;};struct ghw_type_record{ enum ghdl_rtik kind; const char *name; int nbr_fields; int nbr_el; /* Number of scalar signals. */ struct ghw_record_element *el;}; union ghw_type{ enum ghdl_rtik kind; struct ghw_type_common common; struct ghw_type_enum en; struct ghw_type_scalar sc; struct ghw_type_physical ph; struct ghw_subtype_scalar ss; struct ghw_subtype_array sa; struct ghw_type_array ar; struct ghw_type_record rec;};union ghw_val{ unsigned char b2; unsigned char e8; int32_t i32; int64_t i64; double f64;};/* A non-composite signal. */struct ghw_sig{ union ghw_type *type; union ghw_val *val;};enum ghw_hie_kind { ghw_hie_eoh = 0, ghw_hie_design = 1, ghw_hie_block = 3, ghw_hie_generate_if = 4, ghw_hie_generate_for = 5, ghw_hie_instance = 6, ghw_hie_process = 13, ghw_hie_generic = 14, ghw_hie_eos = 15, ghw_hie_signal = 16, ghw_hie_port_in = 17, ghw_hie_port_out = 18, ghw_hie_port_inout = 19, ghw_hie_port_buffer = 20, ghw_hie_port_linkage = 21};struct ghw_hie{ enum ghw_hie_kind kind; struct ghw_hie *parent; const char *name; struct ghw_hie *brother; union { struct { struct ghw_hie *child; union ghw_type *iter_type; union ghw_val *iter_value; } blk; struct { union ghw_type *type; /* Array of signal elements. Last element is 0. */ unsigned int *sigs; } sig; } u;};struct ghw_handler{ FILE *stream; /* True if words are big-endian. */ int word_be; int word_len; int off_len; /* Minor version. */ int version; /* Set by user. */ int flag_verbose; /* String table. */ /* Number of strings. */ int nbr_str; /* Size of the strings (without nul). */ int str_size; /* String table. */ char **str_table; /* Array containing strings. */ char *str_content; /* Type table. */ int nbr_types; union ghw_type **types; /* Non-composite (or basic) signals. */ int nbr_sigs; struct ghw_sig *sigs; /* Hierarchy. */ struct ghw_hie *hie; /* Time of the next cycle. */ int64_t snap_time;};/* Open a GHW file with H. Return < 0 in case of error. */int ghw_open (struct ghw_handler *h, const char *filename);union ghw_type *ghw_get_base_type (union ghw_type *t);/* Put the ASCII representation of VAL into BUF, whose size if LEN. A NUL is always written to BUF. */void ghw_get_value (char *buf, int len, union ghw_val *val, union ghw_type *type);const char *ghw_get_hie_name (struct ghw_hie *h);void ghw_disp_hie (struct ghw_handler *h, struct ghw_hie *top);int ghw_read_base (struct ghw_handler *h);void ghw_disp_values (struct ghw_handler *h);int ghw_read_cycle_start (struct ghw_handler *h);int ghw_read_cycle_cont (struct ghw_handler *h, int *list);int ghw_read_cycle_next (struct ghw_handler *h);int ghw_read_cycle_end (struct ghw_handler *h);enum ghw_sm_type { /* At init; Read section name. */ ghw_sm_init = 0, ghw_sm_sect = 1, ghw_sm_cycle = 2};enum ghw_res { ghw_res_error = -1, ghw_res_eof = -2, ghw_res_ok = 0, ghw_res_snapshot = 1, ghw_res_cycle = 2, ghw_res_other = 3};int ghw_read_sm (struct ghw_handler *h, enum ghw_sm_type *sm);int ghw_read_dump (struct ghw_handler *h);struct ghw_section { const char name[4]; int (*handler)(struct ghw_handler *h);};extern struct ghw_section ghw_sections[];int ghw_read_section (struct ghw_handler *h);void ghw_close (struct ghw_handler *h);const char *ghw_get_dir (int is_downto);void ghw_disp_range (union ghw_range *rng);void ghw_disp_type (struct ghw_handler *h, union ghw_type *t);void ghw_disp_types (struct ghw_handler *h);#endif /* _GHWLIB_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -