aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorumarcor <unai.martinezcorral@ehu.eus>2021-04-23 01:06:14 +0200
committertgingold <tgingold@users.noreply.github.com>2021-04-23 05:34:09 +0200
commit8136add60a289d1195817b0ba4e002e38e7e7263 (patch)
tree125995aad6bf67bb8933ecaba20ae64d1991cf8b /src
parentdc2542b1faef1817d7166458fd51dd2c001f45af (diff)
downloadghdl-8136add60a289d1195817b0ba4e002e38e7e7263.tar.gz
ghdl-8136add60a289d1195817b0ba4e002e38e7e7263.tar.bz2
ghdl-8136add60a289d1195817b0ba4e002e38e7e7263.zip
move ghwlib and ghwdump sources to subdir 'ghw'
Diffstat (limited to 'src')
-rw-r--r--src/grt/ghwdump.c320
-rw-r--r--src/grt/ghwlib.c2235
-rw-r--r--src/grt/ghwlib.h465
3 files changed, 0 insertions, 3020 deletions
diff --git a/src/grt/ghwdump.c b/src/grt/ghwdump.c
deleted file mode 100644
index d6e2d247d..000000000
--- a/src/grt/ghwdump.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/* Display a GHDL Wavefile for debugging.
- Copyright (C) 2005 Tristan Gingold
-
- This program 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 of the License, or
- (at your option) any later version.
-
- This program 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 this program. If not, see <gnu.org/licenses>.
-*/
-
-#include <stdio.h>
-#include <assert.h>
-#include <stdint.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "ghwlib.h"
-
-static const char *progname;
-void
-usage (void)
-{
- printf ("usage: %s [OPTIONS] FILEs...\n", progname);
- printf ("Options are:\n"
- " -t display types\n"
- " -h display hierarchy\n"
- " -H display hierarchy with full pathnames\n"
- " -T display time\n"
- " -s display signals (and time)\n"
- " -S display strings\n"
- " -f <lst> list of signals to display (default: all, example: -f 1,3,5-7,21-33)\n"
- " -l display list of sections\n"
- " -v verbose\n");
-}
-
-static void
-add_single_signal (int **signalSet, int *nbSignals, int signal)
-{
- assert (NULL != signalSet);
- assert (NULL != nbSignals);
- assert (0 <= nbSignals[0]);
- assert (0 <= signal);
-
- int newSize = (1 + nbSignals[0]);
- /*printf("adding signal %6d set of signals to display\n", signal); */
- signalSet[0] = (int *) realloc (signalSet[0], newSize * sizeof (int));
- signalSet[0][nbSignals[0]] = signal;
- nbSignals[0] = newSize;
-}
-
-static void
-add_signal_range (int **signalSet,
- int *nbSignals, const char *s, const char *e)
-{
-
- int i;
- int rangeSize;
- int rangeEnd = -1;
- int rangeStart = -1;
- int bytesMatched = -1;
- int expected = ((e - s) - 1);
- int itemsMatched = sscanf (s,
- "%d-%d%n",
- &rangeStart,
- &rangeEnd,
- &bytesMatched);
- if (2 == itemsMatched && expected == bytesMatched)
- {
- if (rangeEnd < rangeStart)
- {
- int t = rangeEnd;
- rangeEnd = rangeStart;
- rangeStart = t;
- }
- }
- else
- {
- itemsMatched = sscanf (s, "%d%n", &rangeStart, &bytesMatched);
- if (1 == itemsMatched && expected == bytesMatched)
- {
- if (0 <= rangeStart)
- {
- rangeEnd = rangeStart;
- }
- }
- }
-
- rangeSize = (rangeEnd - rangeStart);
- if (rangeEnd < 0 || rangeStart < 0 || rangeSize < 0)
- {
- fprintf (stderr,
- "incorrect signal range specification\"%s\" found in command line, aborting\n",
- s);
- exit (1);
- }
-
- for (i = rangeStart; i <= rangeEnd; ++i)
- {
- add_single_signal (signalSet, nbSignals, i);
- }
-}
-
-static void
-add_signals (int **signalSet, int *nbSignals, const char *arg)
-{
- int c = -1;
- const char *e;
- const char *s = e = arg;
- while (0 != c)
- {
- c = *(e++);
- if (',' == c || 0 == c)
- {
- add_signal_range (signalSet, nbSignals, s, e);
- s = e;
- }
- }
-}
-
-static void
-disp_string_table (struct ghw_handler *hp)
-{
- int i;
- printf ("String table:\n");
-
- for (i = 1; i < hp->nbr_str; i++)
- printf (" %s\n", hp->str_table[i]);
-}
-
-int
-main (int argc, char **argv)
-{
- int i;
- int flag_disp_types;
- int flag_disp_hierarchy;
- int flag_disp_time;
- int flag_disp_signals;
- int flag_disp_strings;
- int flag_full_names;
- int flag_list;
- int flag_verbose;
- int nb_signals;
- int *signal_set;
- int filter_done;
- int eof;
- enum ghw_sm_type sm;
-
- progname = argv[0];
- flag_disp_types = 0;
- flag_disp_hierarchy = 0;
- flag_full_names = 0;
- flag_disp_time = 0;
- flag_disp_signals = 0;
- flag_disp_strings = 0;
- flag_list = 0;
- flag_verbose = 0;
- nb_signals = 0;
- signal_set = NULL;
- filter_done = 0;
-
- while (1)
- {
- int c;
-
- c = getopt (argc, argv, "thHTsSlvf:");
- if (c == -1)
- break;
- switch (c)
- {
- case 't':
- flag_disp_types = 1;
- break;
- case 'h':
- flag_disp_hierarchy = 1;
- break;
- case 'H':
- flag_disp_hierarchy = 1;
- flag_full_names = 1;
- break;
- case 'T':
- flag_disp_time = 1;
- break;
- case 's':
- flag_disp_signals = 1;
- flag_disp_time = 1;
- break;
- case 'S':
- flag_disp_strings = 1;
- break;
- case 'f':
- add_signals (&signal_set, &nb_signals, optarg);
- break;
- case 'l':
- flag_list = 1;
- break;
- case 'v':
- flag_verbose++;
- break;
- default:
- usage ();
- exit (2);
- }
- }
-
- if (optind >= argc)
- {
- usage ();
- return 1;
- }
-
- for (i = optind; i < argc; i++)
- {
- struct ghw_handler h;
- struct ghw_handler *hp = &h;
-
- hp->flag_verbose = flag_verbose;
-
- if (ghw_open (hp, argv[i]) != 0)
- {
- fprintf (stderr, "cannot open ghw file %s\n", argv[i]);
- return 1;
- }
- if (flag_list)
- {
- while (1)
- {
- const char *section_name;
- int section;
-
- section = ghw_read_section (hp);
- if (section == -2)
- {
- printf ("eof of file\n");
- break;
- }
- else if (section < 0)
- {
- printf ("Error in file\n");
- break;
- }
- else if (section == 0)
- {
- printf ("Unknown section\n");
- break;
- }
- section_name = ghw_sections[section].name;
- printf ("Section %s\n", section_name);
- if ((*ghw_sections[section].handler)(hp) < 0)
- break;
-
- if (flag_disp_strings && strcmp (section_name, "STR") == 0)
- disp_string_table (hp);
- else if (flag_disp_types && strcmp (section_name, "TYP") == 0)
- ghw_disp_types (hp);
- }
- }
- else
- {
- if (ghw_read_base (hp) < 0)
- {
- fprintf (stderr, "cannot read ghw file\n");
- return 2;
- }
- if (flag_disp_types)
- ghw_disp_types (hp);
- if (flag_disp_hierarchy)
- {
- hp->flag_full_names = flag_full_names;
- ghw_disp_hie (hp, hp->hie);
- }
-
-#if 1
- sm = ghw_sm_init;
- eof = 0;
- while (!eof)
- {
- switch (ghw_read_sm (hp, &sm))
- {
- case ghw_res_snapshot:
- case ghw_res_cycle:
- if (flag_disp_time)
- printf ("Time is %lld fs\n", hp->snap_time);
- if (flag_disp_signals)
- {
- if (!filter_done)
- {
- ghw_filter_signals (hp, signal_set, nb_signals);
- filter_done = 1;
- }
- ghw_disp_values (hp);
- }
- break;
- case ghw_res_eof:
- eof = 1;
- break;
- default:
- abort ();
- }
- }
-
-#else
- if (ghw_read_dump (hp) < 0)
- {
- fprintf (stderr, "error in ghw dump\n");
- return 3;
- }
-#endif
- }
- ghw_close (&h);
- }
- return 0;
-}
diff --git a/src/grt/ghwlib.c b/src/grt/ghwlib.c
deleted file mode 100644
index 7c406fda2..000000000
--- a/src/grt/ghwlib.c
+++ /dev/null
@@ -1,2235 +0,0 @@
-/* GHDL Wavefile reader library.
- Copyright (C) 2005 Tristan Gingold
-
- This program 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 of the License, or
- (at your option) any later version.
-
- This program 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 this program. If not, see <gnu.org/licenses>.
-*/
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <assert.h>
-
-#include "ghwlib.h"
-
-/* Reopen H through decompressor DECOMP. */
-
-static int
-ghw_openz (struct ghw_handler *h, const char *decomp, const char *filename)
-{
- int plen = strlen (decomp) + 1 + strlen(filename) + 1;
- char *p = malloc (plen);
-
- snprintf (p, plen, "%s %s", decomp, filename);
- fclose (h->stream);
- h->stream = popen(p, "r");
- free (p);
-
- if (h->stream == NULL)
- return -1;
-
- h->stream_ispipe = 1;
-
- return 0;
-}
-
-int
-ghw_open (struct ghw_handler *h, const char *filename)
-{
- char hdr[16];
-
- h->stream = fopen (filename, "rb");
- if (h->stream == NULL)
- return -1;
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
-
- /* Check compression layer. */
- if (!memcmp (hdr, "\x1f\x8b", 2))
- {
- if (ghw_openz (h, "gzip -cd", filename) < 0)
- return -1;
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
- }
- else if (!memcmp (hdr, "BZ", 2))
- {
- if (ghw_openz (h, "bzip2 -cd", filename) < 0)
- return -1;
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
- }
- else
- {
- h->stream_ispipe = 0;
- }
-
- /* Check magic. */
- if (memcmp (hdr, "GHDLwave\n", 9) != 0)
- return -2;
- /* Check version. */
- if (hdr[9] != 16
- || hdr[10] != 0)
- return -2;
- h->version = hdr[11];
- if (h->version > 1)
- return -3;
- if (hdr[12] == 1)
- h->word_be = 0;
- else if (hdr[12] == 2)
- h->word_be = 1;
- else
- return -4;
-#if 0
- /* Endianness. */
- {
- int endian;
- union { unsigned char b[4]; uint32_t i;} v;
- v.i = 0x11223344;
- if (v.b[0] == 0x11)
- endian = 2;
- else if (v.b[0] == 0x44)
- endian = 1;
- else
- return -3;
-
- if (hdr[12] != 1 && hdr[12] != 2)
- return -3;
- if (hdr[12] != endian)
- h->swap_word = 1;
- else
- h->swap_word = 0;
- }
-#endif
- h->word_len = hdr[13];
- h->off_len = hdr[14];
-
- if (hdr[15] != 0)
- return -5;
-
- h->hie = NULL;
- return 0;
-}
-
-int32_t
-ghw_get_i32 (struct ghw_handler *h, unsigned char *b)
-{
- if (h->word_be)
- return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3] << 0);
- else
- return (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | (b[0] << 0);
-}
-
-int64_t
-ghw_get_i64 (struct ghw_handler *ghw_h, unsigned char *b)
-{
- int l, h;
-
- if (ghw_h->word_be)
- {
- h = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3] << 0);
- l = (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | (b[7] << 0);
- }
- else
- {
- l = (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | (b[0] << 0);
- h = (b[7] << 24) | (b[6] << 16) | (b[5] << 8) | (b[4] << 0);
- }
- return (((int64_t)h) << 32) | l;
-}
-
-int
-ghw_read_byte (struct ghw_handler *h, unsigned char *res)
-{
- int v;
-
- v = fgetc (h->stream);
- if (v == EOF)
- return -1;
- *res = v;
- return 0;
-}
-
-int
-ghw_read_uleb128 (struct ghw_handler *h, uint32_t *res)
-{
- uint32_t r = 0;
- unsigned int off = 0;
-
- while (1)
- {
- int v = fgetc (h->stream);
- if (v == EOF)
- return -1;
- r |= (v & 0x7f) << off;
- if ((v & 0x80) == 0)
- break;
- off += 7;
- }
- *res = r;
- return 0;
-}
-
-int
-ghw_read_sleb128 (struct ghw_handler *h, int32_t *res)
-{
- int32_t r = 0;
- unsigned int off = 0;
-
- while (1)
- {
- int v = fgetc (h->stream);
- if (v == EOF)
- return -1;
- r |= ((int32_t)(v & 0x7f)) << off;
- off += 7;
- if ((v & 0x80) == 0)
- {
- if ((v & 0x40) && off < 32)
- r |= ~0U << off;
- break;
- }
- }
- *res = r;
- return 0;
-}
-
-int
-ghw_read_lsleb128 (struct ghw_handler *h, int64_t *res)
-{
- static const int64_t r_mask = -1;
- int64_t r = 0;
- unsigned int off = 0;
-
- while (1)
- {
- int v = fgetc (h->stream);
- if (v == EOF)
- return -1;
- r |= ((int64_t)(v & 0x7f)) << off;
- off += 7;
- if ((v & 0x80) == 0)
- {
- if ((v & 0x40) && off < 64)
- r |= r_mask << off;
- break;
- }
- }
- *res = r;
- return 0;
-}
-
-int
-ghw_read_f64 (struct ghw_handler *h, double *res)
-{
- /* FIXME: handle byte order. */
- if (fread (res, sizeof (*res), 1, h->stream) != 1)
- return -1;
- return 0;
-}
-
-const char *
-ghw_read_strid (struct ghw_handler *h)
-{
- uint32_t id;
-
- if (ghw_read_uleb128 (h, &id) != 0)
- return NULL;
- return h->str_table[id];
-}
-
-union ghw_type *
-ghw_read_typeid (struct ghw_handler *h)
-{
- uint32_t id;
-
- if (ghw_read_uleb128 (h, &id) != 0)
- return NULL;
- return h->types[id - 1];
-}
-
-union ghw_range *
-ghw_read_range (struct ghw_handler *h)
-{
- int t = fgetc (h->stream);
- if (t == EOF)
- return NULL;
- switch (t & 0x7f)
- {
- case ghdl_rtik_type_b2:
- {
- struct ghw_range_b2 *r;
- r = malloc (sizeof (struct ghw_range_b2));
- r->kind = t & 0x7f;
- r->dir = (t & 0x80) != 0;
- if (ghw_read_byte (h, &r->left) != 0)
- goto err_b2;
- if (ghw_read_byte (h, &r->right) != 0)
- goto err_b2;
- return (union ghw_range *)r;
- err_b2:
- free (r);
- return NULL;
- }
- case ghdl_rtik_type_e8:
- {
- struct ghw_range_e8 *r;
- r = malloc (sizeof (struct ghw_range_e8));
- r->kind = t & 0x7f;
- r->dir = (t & 0x80) != 0;
- if (ghw_read_byte (h, &r->left) != 0)
- goto err_e8;
- if (ghw_read_byte (h, &r->right) != 0)
- goto err_e8;
- return (union ghw_range *)r;
- err_e8:
- free (r);
- return NULL;
- }
- case ghdl_rtik_type_i32:
- case ghdl_rtik_type_p32:
- {
- struct ghw_range_i32 *r;
- r = malloc (sizeof (struct ghw_range_i32));
- r->kind = t & 0x7f;
- r->dir = (t & 0x80) != 0;
- if (ghw_read_sleb128 (h, &r->left) != 0)
- goto err_i32;
- if (ghw_read_sleb128 (h, &r->right) != 0)
- goto err_i32;
- return (union ghw_range *)r;
- err_i32:
- free (r);
- return NULL;
- }
- case ghdl_rtik_type_i64:
- case ghdl_rtik_type_p64:
- {
- struct ghw_range_i64 *r;
- r = malloc (sizeof (struct ghw_range_i64));
- r->kind = t & 0x7f;
- r->dir = (t & 0x80) != 0;
- if (ghw_read_lsleb128 (h, &r->left) != 0)
- goto err_i64;
- if (ghw_read_lsleb128 (h, &r->right) != 0)
- goto err_i64;
- return (union ghw_range *)r;
- err_i64:
- free (r);
- return NULL;
- }
- case ghdl_rtik_type_f64:
- {
- struct ghw_range_f64 *r;
- r = malloc (sizeof (struct ghw_range_f64));
- r->kind = t & 0x7f;
- r->dir = (t & 0x80) != 0;
- if (ghw_read_f64 (h, &r->left) != 0)
- goto err_f64;
- if (ghw_read_f64 (h, &r->right) != 0)
- goto err_f64;
- return (union ghw_range *)r;
- err_f64:
- free (r);
- return NULL;
- }
- default:
- fprintf (stderr, "ghw_read_range: type %d unhandled\n", t & 0x7f);
- return NULL;
- }
-}
-
-int
-ghw_read_str (struct ghw_handler *h)
-{
- unsigned char hdr[12];
- unsigned i;
- char *p;
- int prev_len;
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
-
- if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0)
- return -1;
- h->nbr_str = ghw_get_i32 (h, &hdr[4]);
- h->nbr_str++;
- h->str_size = ghw_get_i32 (h, &hdr[8]);
- h->str_table = (char **)malloc ((h->nbr_str + 1) * sizeof (char *));
- h->str_content = (char *)malloc (h->str_size + h->nbr_str + 1);
-
- if (h->flag_verbose)
- {
- printf ("Number of strings: %u\n", h->nbr_str - 1);
- printf ("String table size: %u\n", h->str_size);
- }
-
- h->str_table[0] = "<anon>";
- p = h->str_content;
- prev_len = 0;
- for (i = 1; i < h->nbr_str; i++)
- {
- int j;
- int c;
- char *prev;
- int sh;
-
- h->str_table[i] = p;
- prev = h->str_table[i - 1];
- for (j = 0; j < prev_len; j++)
- *p++ = prev[j];
-
- while (1)
- {
- c = fgetc (h->stream);
- if (c == EOF)
- return -1;
- if ((c >= 0 && c <= 31)
- || (c >= 128 && c <= 159))
- break;
- *p++ = c;
- }
- *p++ = 0;
-
- if (h->flag_verbose > 1)
- printf (" string %u (pl=%d): %s\n", i, prev_len, h->str_table[i]);
-
- prev_len = c & 0x1f;
- sh = 5;
- while (c >= 128)
- {
- c = fgetc (h->stream);
- if (c == EOF)
- return -1;
- prev_len |= (c & 0x1f) << sh;
- sh += 5;
- }
- }
- if (fread (hdr, 4, 1, h->stream) != 1)
- return -1;
- if (memcmp (hdr, "EOS", 4) != 0)
- return -1;
- return 0;
-}
-
-union ghw_type *
-ghw_get_base_type (union ghw_type *t)
-{
- switch (t->kind)
- {
- case ghdl_rtik_type_b2:
- case ghdl_rtik_type_e8:
- case ghdl_rtik_type_e32:
- case ghdl_rtik_type_i32:
- case ghdl_rtik_type_i64:
- case ghdl_rtik_type_f64:
- case ghdl_rtik_type_p32:
- case ghdl_rtik_type_p64:
- case ghdl_rtik_type_array:
- return t;
- case ghdl_rtik_subtype_scalar:
- return t->ss.base;
- case ghdl_rtik_subtype_array:
- return t->sa.base;
- case ghdl_rtik_subtype_unbounded_array:
- return t->sua.base;
- default:
- fprintf (stderr, "ghw_get_base_type: cannot handle type %d\n", t->kind);
- abort ();
- }
-}
-
-/* Return -1 for unbounded types. */
-static int
-get_nbr_elements (union ghw_type *t)
-{
- switch (t->kind)
- {
- case ghdl_rtik_type_b2:
- case ghdl_rtik_type_e8:
- case ghdl_rtik_type_e32:
- case ghdl_rtik_type_i32:
- case ghdl_rtik_type_i64:
- case ghdl_rtik_type_f64:
- case ghdl_rtik_type_p32:
- case ghdl_rtik_type_p64:
- case ghdl_rtik_subtype_scalar:
- return 1;
- case ghdl_rtik_type_array:
- return -1;
- case ghdl_rtik_subtype_array:
- return t->sa.nbr_scalars;
- case ghdl_rtik_type_record:
- return t->rec.nbr_scalars;
- case ghdl_rtik_subtype_record:
- return t->sr.nbr_scalars;
- case ghdl_rtik_subtype_unbounded_record:
- case ghdl_rtik_subtype_unbounded_array:
- return -1;
- default:
- fprintf (stderr, "get_nbr_elements: unhandled type %d\n", t->kind);
- abort ();
- }
-}
-
-int
-ghw_get_range_length (union ghw_range *rng)
-{
- int res;
-
- assert (rng != NULL);
-
- switch (rng->kind)
- {
- case ghdl_rtik_type_i32:
- if (rng->i32.dir)
- res = rng->i32.left - rng->i32.right + 1;
- else
- res = rng->i32.right - rng->i32.left + 1;
- break;
- case ghdl_rtik_type_b2:
- if (rng->b2.dir)
- res = rng->b2.left - rng->b2.right + 1;
- else
- res = rng->b2.right - rng->b2.left + 1;
- break;
- case ghdl_rtik_type_e8:
- if (rng->e8.dir)
- res = rng->e8.left - rng->e8.right + 1;
- else
- res = rng->e8.right - rng->e8.left + 1;
- break;
- default:
- fprintf (stderr, "get_range_length: unhandled kind %d\n", rng->kind);
- abort ();
- }
- /* The length of a null range is 0. */
- return (res <= 0) ? 0 : res;
-}
-
-static union ghw_type *
-ghw_read_type_bounds (struct ghw_handler *h, union ghw_type *base);
-
-/* Create an array subtype using BASE and ranges read from H. */
-
-struct ghw_subtype_array *
-ghw_read_array_subtype (struct ghw_handler *h, union ghw_type *base)
-{
- struct ghw_type_array *arr =
- (struct ghw_type_array *)ghw_get_base_type (base);
- struct ghw_subtype_array *sa;
- unsigned j;
- int nbr_scalars;
- int nbr_els;
-
- sa = malloc (sizeof (struct ghw_subtype_array));
- sa->kind = ghdl_rtik_subtype_array;
- sa->name = NULL;
- sa->base = base;
- nbr_els = get_nbr_elements (arr->el);
- nbr_scalars = 1;
- sa->rngs = malloc (arr->nbr_dim * sizeof (union ghw_range *));
- for (j = 0; j < arr->nbr_dim; j++)
- {
- sa->rngs[j] = ghw_read_range (h);
- nbr_scalars *= ghw_get_range_length (sa->rngs[j]);
- }
- if (nbr_els >= 0)
- {
- /* Element type is bounded. */
- sa->el = arr->el;
- }
- else
- {
- /* Read bounds for the elements. */
- sa->el = ghw_read_type_bounds(h, arr->el);
- nbr_els = get_nbr_elements (sa->el);
- }
- sa->nbr_scalars = nbr_scalars * nbr_els;
- return sa;
-}
-
-struct ghw_subtype_record *
-ghw_read_record_subtype (struct ghw_handler *h, struct ghw_type_record *base)
-{
- struct ghw_subtype_record *sr;
-
- sr = malloc (sizeof (struct ghw_subtype_record));
- sr->kind = ghdl_rtik_subtype_record;
- sr->name = NULL;
- sr->base = base;
- if (base->nbr_scalars >= 0)
- {
- /* Record base type is bounded. */
- sr->nbr_scalars = base->nbr_scalars;
- sr->els = base->els;
- }
- else
- {
- /* Read subtypes. */
- unsigned j;
- int nbr_scalars;
-
- sr->els = malloc (base->nbr_fields * sizeof (struct ghw_record_element));
- nbr_scalars = 0;
- for (j = 0; j < base->nbr_fields; j++)
- {
- union ghw_type *btype = base->els[j].type;
- int el_nbr_scalars = get_nbr_elements (btype);
-
- sr->els[j].name = base->els[j].name;
- if (el_nbr_scalars >= 0)
- {
- /* Element is constrained. */
- sr->els[j].type = btype;
- }
- else
- {
- sr->els[j].type = ghw_read_type_bounds(h, btype);
- el_nbr_scalars = get_nbr_elements (sr->els[j].type);
- }
- nbr_scalars += el_nbr_scalars;
- }
- sr->nbr_scalars = nbr_scalars;
- }
- return sr;
-}
-
-/* Read bounds for BASE and create a subtype. */
-
-static union ghw_type *
-ghw_read_type_bounds (struct ghw_handler *h, union ghw_type *base)
-{
- switch (base->kind)
- {
- case ghdl_rtik_type_array:
- case ghdl_rtik_subtype_unbounded_array:
- return (union ghw_type *)ghw_read_array_subtype (h, base);
- break;
- case ghdl_rtik_type_record:
- case ghdl_rtik_subtype_unbounded_record:
- return (union ghw_type *)ghw_read_record_subtype (h, &base->rec);
- break;
- default:
- fprintf (stderr, "ghw_read_type_bounds: unhandled kind %d\n",
- base->kind);
- return NULL;
- }
-}
-
-int
-ghw_read_type (struct ghw_handler *h)
-{
- unsigned char hdr[8];
- unsigned i;
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
-
- if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0)
- return -1;
- h->nbr_types = ghw_get_i32 (h, &hdr[4]);
- h->types = (union ghw_type **)
- malloc (h->nbr_types * sizeof (union ghw_type *));
-
- for (i = 0; i < h->nbr_types; i++)
- {
- int t;
-
- t = fgetc (h->stream);
- if (t == EOF)
- return -1;
- if (h->flag_verbose > 1)
- printf ("type[%d]= %d\n", i, t);
- switch (t)
- {
- case ghdl_rtik_type_b2:
- case ghdl_rtik_type_e8:
- {
- struct ghw_type_enum *e;
- unsigned j;
-
- e = malloc (sizeof (struct ghw_type_enum));
- e->kind = t;
- e->wkt = ghw_wkt_unknown;
- e->name = ghw_read_strid (h);
- if (ghw_read_uleb128 (h, &e->nbr) != 0)
- goto err_b2;
- e->lits = (const char **) malloc (e->nbr * sizeof (char *));
- if (h->flag_verbose > 1)
- printf ("enum %s:", e->name);
- for (j = 0; j < e->nbr; j++)
- {
- e->lits[j] = ghw_read_strid (h);
- if (h->flag_verbose > 1)
- printf (" %s", e->lits[j]);
- }
- if (h->flag_verbose > 1)
- printf ("\n");
- h->types[i] = (union ghw_type *)e;
- break;
- err_b2:
- free (e);
- return -1;
- }
- break;
- case ghdl_rtik_type_i32:
- case ghdl_rtik_type_i64:
- case ghdl_rtik_type_f64:
- {
- struct ghw_type_scalar *sc;
-
- sc = malloc (sizeof (struct ghw_type_scalar));
- sc->kind = t;
- sc->name = ghw_read_strid (h);
- if (h->flag_verbose > 1)
- printf ("scalar: %s\n", sc->name);
- h->types[i] = (union ghw_type *)sc;
- }
- break;
- case ghdl_rtik_type_p32:
- case ghdl_rtik_type_p64:
- {
- struct ghw_type_physical *ph;
-
- ph = malloc (sizeof (struct ghw_type_physical));
- ph->kind = t;
- ph->name = ghw_read_strid (h);
- ph->units = NULL;
- if (h->version == 0)
- ph->nbr_units = 0;
- else
- {
- unsigned j;
-
- if (ghw_read_uleb128 (h, &ph->nbr_units) != 0)
- goto err_p32;
- ph->units = malloc (ph->nbr_units * sizeof (struct ghw_unit));
- for (j = 0; j < ph->nbr_units; j++)
- {
- ph->units[j].name = ghw_read_strid (h);
- if (ghw_read_lsleb128 (h, &ph->units[j].val) < 0)
- goto err_p32;
- }
- }
- if (h->flag_verbose > 1)
- printf ("physical: %s\n", ph->name);
- h->types[i] = (union ghw_type *)ph;
- break;
- err_p32:
- free (ph->units);
- free (ph);
- return -1;
- }
- break;
- case ghdl_rtik_subtype_scalar:
- {
- struct ghw_subtype_scalar *ss;
-
- ss = malloc (sizeof (struct ghw_subtype_scalar));
- ss->kind = t;
- ss->name = ghw_read_strid (h);
- ss->base = ghw_read_typeid (h);
- ss->rng = ghw_read_range (h);
- if (h->flag_verbose > 1)
- printf ("subtype scalar: %s\n", ss->name);
- h->types[i] = (union ghw_type *)ss;
- }
- break;
- case ghdl_rtik_type_array:
- {
- struct ghw_type_array *arr;
- unsigned j;
-
- arr = malloc (sizeof (struct ghw_type_array));
- arr->kind = t;
- arr->name = ghw_read_strid (h);
- arr->el = ghw_read_typeid (h);
- if (ghw_read_uleb128 (h, &arr->nbr_dim) != 0)
- goto err_array;
- arr->dims = (union ghw_type **)
- malloc (arr->nbr_dim * sizeof (union ghw_type *));
- for (j = 0; j < arr->nbr_dim; j++)
- arr->dims[j] = ghw_read_typeid (h);
- if (h->flag_verbose > 1)
- printf ("array: %s (ndim=%u) of %s\n",
- arr->name, arr->nbr_dim, arr->el->common.name);
- h->types[i] = (union ghw_type *)arr;
- break;
- err_array:
- free (arr);
- return -1;
- }
- break;
- case ghdl_rtik_subtype_array:
- {
- struct ghw_subtype_array *sa;
- const char *name;
- union ghw_type *base;
-
- name = ghw_read_strid (h);
- base = ghw_read_typeid (h);
-
- sa = ghw_read_array_subtype (h, base);
- sa->name = name;
- h->types[i] = (union ghw_type *)sa;
- if (h->flag_verbose > 1)
- printf ("subtype array: %s (nbr_scalars=%d)\n",
- sa->name, sa->nbr_scalars);
- }
- break;
- case ghdl_rtik_subtype_unbounded_array:
- {
- struct ghw_subtype_unbounded_array *sua;
-
- sua = malloc (sizeof (struct ghw_subtype_unbounded_array));
- sua->kind = t;
- sua->name = ghw_read_strid (h);
- sua->base = ghw_read_typeid (h);
- h->types[i] = (union ghw_type *)sua;
- if (h->flag_verbose > 1)
- printf ("subtype unbounded array: %s\n", sua->name);
- }
- break;
- case ghdl_rtik_type_record:
- {
- struct ghw_type_record *rec;
- unsigned j;
- int nbr_scalars;
-
- rec = malloc (sizeof (struct ghw_type_record));
- rec->kind = t;
- rec->name = ghw_read_strid (h);
- rec->els = NULL;
- if (ghw_read_uleb128 (h, &rec->nbr_fields) != 0)
- goto err_record;
- rec->els = malloc
- (rec->nbr_fields * sizeof (struct ghw_record_element));
- nbr_scalars = 0;
- for (j = 0; j < rec->nbr_fields; j++)
- {
- rec->els[j].name = ghw_read_strid (h);
- rec->els[j].type = ghw_read_typeid (h);
- if (nbr_scalars != -1)
- {
- int field_nbr_scalars = get_nbr_elements (rec->els[j].type);
- if (field_nbr_scalars == -1)
- nbr_scalars = -1;
- else
- nbr_scalars += field_nbr_scalars;
- }
- }
- rec->nbr_scalars = nbr_scalars;
- if (h->flag_verbose > 1)
- printf ("record type: %s (nbr_scalars=%d)\n",
- rec->name, rec->nbr_scalars);
- h->types[i] = (union ghw_type *)rec;
- break;
- err_record:
- free (rec->els);
- free (rec);
- return -1;
- }
- break;
- case ghdl_rtik_subtype_record:
- {
- struct ghw_subtype_record *sr;
- const char *name;
- struct ghw_type_record *base;
-
- name = ghw_read_strid (h);
- base = (struct ghw_type_record *)ghw_read_typeid (h);
-
- sr = ghw_read_record_subtype (h, base);
- sr->name = name;
- h->types[i] = (union ghw_type *)sr;
- if (h->flag_verbose > 1)
- printf ("subtype record: %s (nbr_scalars=%d)\n",
- sr->name, sr->nbr_scalars);
- }
- break;
- default:
- fprintf (stderr, "ghw_read_type: unknown type %d\n", t);
- return -1;
- }
- }
- if (fgetc (h->stream) != 0)
- return -1;
- return 0;
-}
-
-int
-ghw_read_wk_types (struct ghw_handler *h)
-{
- char hdr[4];
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
-
- if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0)
- return -1;
-
- while (1)
- {
- int t;
- union ghw_type *tid;
-
- t = fgetc (h->stream);
- if (t == EOF)
- return -1;
- else if (t == 0)
- break;
-
- tid = ghw_read_typeid (h);
- if (tid->kind == ghdl_rtik_type_b2
- || tid->kind == ghdl_rtik_type_e8)
- {
- if (h->flag_verbose > 0)
- printf ("%s: wkt=%d\n", tid->en.name, t);
- tid->en.wkt = t;
- }
- }
- return 0;
-}
-
-void
-ghw_disp_typename (struct ghw_handler *h, union ghw_type *t)
-{
- (void)h;
- printf ("%s", t->common.name);
-}
-
-/* Read a signal composed of severals elements.
- Return 0 for success. */
-int
-ghw_read_signal (struct ghw_handler *h, unsigned int *sigs, union ghw_type *t)
-{
- switch (t->kind)
- {
- case ghdl_rtik_type_b2:
- case ghdl_rtik_type_e8:
- case ghdl_rtik_type_e32:
- case ghdl_rtik_subtype_scalar:
- {
- unsigned int sig_el;
-
- if (ghw_read_uleb128 (h, &sig_el) < 0)
- return -1;
- *sigs = sig_el;
- if (sig_el == 0 || sig_el >= h->nbr_sigs)
- return -1;
- if (h->sigs[sig_el].type == NULL)
- h->sigs[sig_el].type = ghw_get_base_type (t);
- }
- return 0;
- case ghdl_rtik_subtype_array:
- {
- int i;
- int stride;
- int len;
-
- len = t->sa.nbr_scalars;
- stride = get_nbr_elements (t->sa.el);
-
- for (i = 0; i < len; i += stride)
- if (ghw_read_signal (h, &sigs[i], t->sa.el) < 0)
- return -1;
- }
- return 0;
- case ghdl_rtik_type_record:
- {
- struct ghw_type_record *r = &t->rec;
- int nbr_fields = r->nbr_fields;
- int i;
- int off;
-
- off = 0;
- for (i = 0; i < nbr_fields; i++)
- {
- if (ghw_read_signal (h, &sigs[off], r->els[i].type) < 0)
- return -1;
- off += get_nbr_elements (r->els[i].type);
- }
- }
- return 0;
- case ghdl_rtik_subtype_record:
- {
- struct ghw_subtype_record *sr = &t->sr;
- int nbr_fields = sr->base->nbr_fields;
- int i;
- int off;
-
- off = 0;
- for (i = 0; i < nbr_fields; i++)
- {
- if (ghw_read_signal (h, &sigs[off], sr->els[i].type) < 0)
- return -1;
- off += get_nbr_elements (sr->els[i].type);
- }
- }
- return 0;
- default:
- fprintf (stderr, "ghw_read_signal: type kind %d unhandled\n", t->kind);
- abort ();
- }
-}
-
-
-int
-ghw_read_value (struct ghw_handler *h,
- union ghw_val *val, union ghw_type *type)
-{
- switch (ghw_get_base_type (type)->kind)
- {
- case ghdl_rtik_type_b2:
- {
- int v;
- v = fgetc (h->stream);
- if (v == EOF)
- return -1;
- val->b2 = v;
- }
- break;
- case ghdl_rtik_type_e8:
- {
- int v;
- v = fgetc (h->stream);
- if (v == EOF)
- return -1;
- val->e8 = v;
- }
- break;
- case ghdl_rtik_type_i32:
- case ghdl_rtik_type_p32:
- {
- int32_t v;
- if (ghw_read_sleb128 (h, &v) < 0)
- return -1;
- val->i32 = v;
- }
- break;
- case ghdl_rtik_type_f64:
- {
- double v;
- if (ghw_read_f64 (h, &v) < 0)
- return -1;
- val->f64 = v;
- }
- break;
- case ghdl_rtik_type_p64:
- {
- int64_t v;
- if (ghw_read_lsleb128 (h, &v) < 0)
- return -1;
- val->i64 = v;
- }
- break;
- default:
- fprintf (stderr, "read_value: cannot handle format %d\n", type->kind);
- abort ();
- }
- return 0;
-}
-
-int
-ghw_read_hie (struct ghw_handler *h)
-{
- unsigned char hdr[16];
- int nbr_scopes;
- int nbr_sigs;
- unsigned i;
- struct ghw_hie *blk;
- struct ghw_hie **last;
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
-
- if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0)
- return -1;
- nbr_scopes = ghw_get_i32 (h, &hdr[4]);
- /* Number of declared signals (which may be composite). */
- nbr_sigs = ghw_get_i32 (h, &hdr[8]);
- /* Number of basic signals. */
- h->nbr_sigs = ghw_get_i32 (h, &hdr[12]);
-
- if (h->flag_verbose)
- printf ("%u scopes, %u signals, %u signal elements\n",
- nbr_scopes, nbr_sigs, h->nbr_sigs);
-
- blk = (struct ghw_hie *)malloc (sizeof (struct ghw_hie));
- blk->kind = ghw_hie_design;
- blk->name = NULL;
- blk->parent = NULL;
- blk->brother = NULL;
- blk->u.blk.child = NULL;
-
- last = &blk->u.blk.child;
- h->hie = blk;
-
- h->nbr_sigs++;
- h->skip_sigs = NULL;
- h->flag_full_names = 0;
- h->sigs = (struct ghw_sig *) malloc (h->nbr_sigs * sizeof (struct ghw_sig));
- memset (h->sigs, 0, h->nbr_sigs * sizeof (struct ghw_sig));
-
- while (1)
- {
- int t;
- struct ghw_hie *el;
- unsigned int str;
-
- t = fgetc (h->stream);
- if (t == EOF)
- return -1;
- if (t == 0)
- break;
-
- if (t == ghw_hie_eos)
- {
- blk = blk->parent;
- if (blk->u.blk.child == NULL)
- last = &blk->u.blk.child;
- else
- {
- struct ghw_hie *l = blk->u.blk.child;
- while (l->brother != NULL)
- l = l->brother;
- last = &l->brother;
- }
-
- continue;
- }
-
- el = (struct ghw_hie *) malloc (sizeof (struct ghw_hie));
- el->kind = t;
- el->parent = blk;
- el->brother = NULL;
-
- /* Link. */
- *last = el;
- last = &el->brother;
-
- /* Read name. */
- if (ghw_read_uleb128 (h, &str) != 0)
- return -1;
- el->name = h->str_table[str];
-
- switch (t)
- {
- case ghw_hie_eoh:
- case ghw_hie_design:
- case ghw_hie_eos:
- /* Should not be here. */
- abort ();
- case ghw_hie_process:
- el->u.blk.child = NULL;
- break;
- case ghw_hie_block:
- case ghw_hie_generate_if:
- case ghw_hie_generate_for:
- case ghw_hie_instance:
- case ghw_hie_generic:
- case ghw_hie_package:
- /* Create a block. */
- el->u.blk.child = NULL;
-
- if (t == ghw_hie_generate_for)
- {
- el->u.blk.iter_type = ghw_read_typeid (h);
- el->u.blk.iter_value = malloc (sizeof (union ghw_val));
- if (ghw_read_value (h, el->u.blk.iter_value,
- el->u.blk.iter_type) < 0)
- return -1;
- }
- blk = el;
- last = &el->u.blk.child;
- break;
- case ghw_hie_signal:
- case ghw_hie_port_in:
- case ghw_hie_port_out:
- case ghw_hie_port_inout:
- case ghw_hie_port_buffer:
- case ghw_hie_port_linkage:
- /* For a signal, read type. */
- {
- int nbr_el;
- unsigned int *sigs;
-
- el->u.sig.type = ghw_read_typeid (h);
- nbr_el = get_nbr_elements (el->u.sig.type);
- if (nbr_el < 0)
- return -1;
- sigs = (unsigned int *) malloc
- ((nbr_el + 1) * sizeof (unsigned int));
- el->u.sig.sigs = sigs;
- /* Last element is NULL. */
- sigs[nbr_el] = 0;
-
- if (h->flag_verbose > 1)
- printf ("signal %s: %d el [", el->name, nbr_el);
- if (ghw_read_signal (h, sigs, el->u.sig.type) < 0)
- return -1;
- if (h->flag_verbose > 1)
- {
- int j;
- for (j = 0; j < nbr_el; j++)
- printf (" #%u", sigs[j]);
- printf ("]\n");
- }
- }
- break;
- default:
- fprintf (stderr, "ghw_read_hie: unhandled kind %d\n", t);
- abort ();
- }
- }
-
- /* Allocate values. */
- for (i = 0; i < h->nbr_sigs; i++)
- if (h->sigs[i].type != NULL)
- h->sigs[i].val = (union ghw_val *) malloc (sizeof (union ghw_val));
- return 0;
-}
-
-const char *
-ghw_get_hie_name (struct ghw_hie *h)
-{
- switch (h->kind)
- {
- case ghw_hie_eoh:
- return "eoh";
- case ghw_hie_design:
- return "design";
- case ghw_hie_block:
- return "block";
- case ghw_hie_generate_if:
- return "generate-if";
- case ghw_hie_generate_for:
- return "generate-for";
- case ghw_hie_instance:
- return "instance";
- case ghw_hie_package:
- return "package";
- case ghw_hie_process:
- return "process";
- case ghw_hie_generic:
- return "generic";
- case ghw_hie_eos:
- return "eos";
- case ghw_hie_signal:
- return "signal";
- case ghw_hie_port_in:
- return "port-in";
- case ghw_hie_port_out:
- return "port-out";
- case ghw_hie_port_inout:
- return "port-inout";
- case ghw_hie_port_buffer:
- return "port-buffer";
- case ghw_hie_port_linkage:
- return "port-linkage";
- default:
- return "??";
- }
-}
-
-void
-ghw_disp_value (union ghw_val *val, union ghw_type *type);
-
-static void
-print_name (struct ghw_hie *hie, int full_names)
-{
- int i;
- int depth;
- struct ghw_hie *p;
- struct ghw_hie **buf;
- struct ghw_hie **end;
-
- /* HIE must be valid. */
- assert (hie->name != NULL);
-
- if (0 == full_names)
- {
- printf (" %s: ", hie->name);
- return;
- }
-
- p = hie;
- depth = 0;
- while (p && p->name)
- {
- p = p->parent;
- ++depth;
- }
- buf = (struct ghw_hie **) malloc (depth * sizeof (struct ghw_hie *));
-
- p = hie;
- end = depth + buf;
- while (p && p->name)
- {
- *(--end) = p;
- p = p->parent;
- }
-
- putchar (' ');
- putchar ('/');
- for (i = 0; i < depth; ++i)
- {
- printf ("%s%s", i ? "/" : "", buf[i]->name);
- if (ghw_hie_generate_for == buf[i]->kind)
- {
- putchar ('(');
- ghw_disp_value (buf[i]->u.blk.iter_value, buf[i]->u.blk.iter_type);
- putchar (')');
- }
- }
- putchar (':');
- putchar (' ');
- free (buf);
-}
-
-void
-ghw_disp_hie (struct ghw_handler *h, struct ghw_hie *top)
-{
- int i;
- int indent;
- struct ghw_hie *hie;
- struct ghw_hie *n;
-
- hie = top;
- indent = 0;
-
- while (1)
- {
- if (0 == h->flag_full_names)
- for (i = 0; i < indent; i++)
- fputc (' ', stdout);
- printf ("%s", ghw_get_hie_name (hie));
-
- switch (hie->kind)
- {
- case ghw_hie_design:
- case ghw_hie_block:
- case ghw_hie_generate_if:
- case ghw_hie_generate_for:
- case ghw_hie_instance:
- case ghw_hie_process:
- case ghw_hie_package:
- if (hie->name)
- print_name (hie, h->flag_full_names);
- if (hie->kind == ghw_hie_generate_for)
- {
- printf ("(");
- ghw_disp_value (hie->u.blk.iter_value, hie->u.blk.iter_type);
- printf (")");
- }
- n = hie->u.blk.child;
- if (n == NULL)
- n = hie->brother;
- else
- indent++;
- break;
- case ghw_hie_generic:
- case ghw_hie_eos:
- abort ();
- case ghw_hie_signal:
- case ghw_hie_port_in:
- case ghw_hie_port_out:
- case ghw_hie_port_inout:
- case ghw_hie_port_buffer:
- case ghw_hie_port_linkage:
- {
- unsigned int *sigs = hie->u.sig.sigs;
- unsigned int k, num;
-
- print_name (hie, h->flag_full_names);
- ghw_disp_subtype_indication (h, hie->u.sig.type);
- printf (":");
- k = 0;
- /* There can be 0-length signals. */
- while (sigs[k] != GHW_NO_SIG)
- {
- /* First signal of the range. */
- printf (" #%u", sigs[k]);
- for (num = 1; sigs[k + num] != GHW_NO_SIG; num++)
- if (sigs[k + num] != sigs[k + num - 1] + 1)
- break;
- if (num > 1)
- printf ("-#%u", sigs[k + num - 1]);
- k += num;
- }
- n = hie->brother;
- }
- break;
- default:
- abort ();
- }
- printf ("\n");
-
- while (n == NULL)
- {
- if (hie->parent == NULL)
- return;
- hie = hie->parent;
- indent--;
- n = hie->brother;
- }
- hie = n;
- }
-}
-
-int
-ghw_read_eoh (struct ghw_handler *h)
-{
- (void)h;
- return 0;
-}
-
-int
-ghw_read_base (struct ghw_handler *h)
-{
- unsigned char hdr[4];
- int res;
-
- while (1)
- {
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
- if (memcmp (hdr, "STR", 4) == 0)
- res = ghw_read_str (h);
- else if (memcmp (hdr, "HIE", 4) == 0)
- res = ghw_read_hie (h);
- else if (memcmp (hdr, "TYP", 4) == 0)
- res = ghw_read_type (h);
- else if (memcmp (hdr, "WKT", 4) == 0)
- res = ghw_read_wk_types (h);
- else if (memcmp (hdr, "EOH", 4) == 0)
- return 0;
- else
- {
- fprintf (stderr, "ghw_read_base: unknown GHW section %c%c%c%c\n",
- hdr[0], hdr[1], hdr[2], hdr[3]);
- return -1;
- }
- if (res != 0)
- {
- fprintf (stderr, "ghw_read_base: error in section %s\n", hdr);
- return res;
- }
- }
-}
-
-int
-ghw_read_signal_value (struct ghw_handler *h, struct ghw_sig *s)
-{
- return ghw_read_value (h, s->val, s->type);
-}
-
-int
-ghw_read_snapshot (struct ghw_handler *h)
-{
- unsigned char hdr[12];
- unsigned i;
- struct ghw_sig *s;
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
-
- if (hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 0 || hdr[3] != 0)
- return -1;
- h->snap_time = ghw_get_i64 (h, &hdr[4]);
- if (h->flag_verbose > 1)
- printf ("Time is " GHWPRI64 " fs\n", h->snap_time);
-
- for (i = 0; i < h->nbr_sigs; i++)
- {
- s = &h->sigs[i];
- if (s->type != NULL)
- {
- if (h->flag_verbose > 1)
- printf ("read type %d for sig %u\n", s->type->kind, i);
- if (ghw_read_signal_value (h, s) < 0)
- return -1;
- }
- }
- if (fread (hdr, 4, 1, h->stream) != 1)
- return -1;
-
- if (memcmp (hdr, "ESN", 4))
- return -1;
-
- return 0;
-}
-
-void ghw_disp_values (struct ghw_handler *h);
-
-int
-ghw_read_cycle_start (struct ghw_handler *h)
-{
- unsigned char hdr[8];
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
-
- h->snap_time = ghw_get_i64 (h, hdr);
- return 0;
-}
-
-int
-ghw_read_cycle_cont (struct ghw_handler *h, int *list)
-{
- int i;
- int *list_p;
-
- i = 0;
- list_p = list;
- while (1)
- {
- uint32_t d;
-
- /* Read delta to next signal. */
- if (ghw_read_uleb128 (h, &d) < 0)
- return -1;
- if (d == 0)
- {
- /* Last signal reached. */
- break;
- }
-
- /* Find next signal. */
- while (d > 0)
- {
- i++;
- if (h->sigs[i].type != NULL)
- d--;
- }
-
- if (ghw_read_signal_value (h, &h->sigs[i]) < 0)
- return -1;
- if (list_p)
- *list_p++ = i;
- }
-
- if (list_p)
- *list_p = 0;
- return 0;
-}
-
-int
-ghw_read_cycle_next (struct ghw_handler *h)
-{
- int64_t d_time;
-
- if (ghw_read_lsleb128 (h, &d_time) < 0)
- return -1;
- if (d_time == -1)
- return 0;
- h->snap_time += d_time;
- return 1;
-}
-
-
-int
-ghw_read_cycle_end (struct ghw_handler *h)
-{
- char hdr[4];
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
- if (memcmp (hdr, "ECY", 4))
- return -1;
-
- return 0;
-}
-
-static const char *
-ghw_get_lit (union ghw_type *type, unsigned e)
-{
- if (e >= type->en.nbr)
- return "??";
- else
- return type->en.lits[e];
-}
-
-static void
-ghw_disp_lit (union ghw_type *type, unsigned e)
-{
- printf ("%s (%u)", ghw_get_lit (type, e), e);
-}
-
-void
-ghw_disp_value (union ghw_val *val, union ghw_type *type)
-{
- switch (ghw_get_base_type (type)->kind)
- {
- case ghdl_rtik_type_b2:
- ghw_disp_lit (type, val->b2);
- break;
- case ghdl_rtik_type_e8:
- ghw_disp_lit (type, val->e8);
- break;
- case ghdl_rtik_type_i32:
- printf (GHWPRI32, val->i32);
- break;
- case ghdl_rtik_type_p64:
- printf (GHWPRI64, val->i64);
- break;
- case ghdl_rtik_type_f64:
- printf ("%g", val->f64);
- break;
- default:
- fprintf (stderr, "ghw_disp_value: cannot handle type %d\n",
- type->kind);
- abort ();
- }
-}
-
-/* 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)
-{
- union ghw_type *base = ghw_get_base_type (type);
-
- switch (base->kind)
- {
- case ghdl_rtik_type_b2:
- if (val->b2 <= 1)
- {
- strncpy (buf, base->en.lits[val->b2], len - 1);
- buf[len - 1] = 0;
- }
- else
- {
- snprintf (buf, len, "?%d", val->b2);
- }
- break;
- case ghdl_rtik_type_e8:
- if (val->b2 <= base->en.nbr)
- {
- strncpy (buf, base->en.lits[val->e8], len - 1);
- buf[len - 1] = 0;
- }
- else
- {
- snprintf (buf, len, "?%d", val->e8);
- }
- break;
- case ghdl_rtik_type_i32:
- snprintf (buf, len, GHWPRI32, val->i32);
- break;
- case ghdl_rtik_type_p64:
- snprintf (buf, len, GHWPRI64, val->i64);
- break;
- case ghdl_rtik_type_f64:
- snprintf (buf, len, "%g", val->f64);
- break;
- default:
- snprintf (buf, len, "?bad type %d?", type->kind);
- }
-}
-
-static char
-is_skip_signal (int *signals_to_keep, int nb_signals_to_keep, int signal)
-{
- int i;
- for (i = 0; i < nb_signals_to_keep; ++i)
- {
- if (signal == signals_to_keep[i])
- {
- return 0;
- }
- }
- return 1;
-}
-
-void
-ghw_filter_signals (struct ghw_handler *h,
- int *signals_to_keep, int nb_signals_to_keep)
-{
- unsigned i;
-
- if (0 < nb_signals_to_keep && 0 != signals_to_keep)
- {
- if (0 == h->skip_sigs)
- {
- h->skip_sigs = (char *) malloc (sizeof (char) * h->nbr_sigs);
- }
- for (i = 0; i < h->nbr_sigs; ++i)
- {
- h->skip_sigs[i] = is_skip_signal (signals_to_keep,
- nb_signals_to_keep, i);
- }
- }
- else
- {
- if (0 != h->skip_sigs)
- {
- free (h->skip_sigs);
- h->skip_sigs = 0;
- }
- }
-}
-
-void
-ghw_disp_values (struct ghw_handler *h)
-{
- unsigned i;
- for (i = 0; i < h->nbr_sigs; i++)
- {
- struct ghw_sig *s = &h->sigs[i];
- int skip = (0 != h->skip_sigs && (0 != h->skip_sigs[i]));
- if (s->type != NULL && !skip)
- {
- printf ("#%u: ", i);
- ghw_disp_value (s->val, s->type);
- printf ("\n");
- }
- }
-}
-int
-ghw_read_directory (struct ghw_handler *h)
-{
- unsigned char hdr[8];
- int nbr_entries;
- int i;
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
-
- nbr_entries = ghw_get_i32 (h, &hdr[4]);
-
- if (h->flag_verbose)
- printf ("Directory (%d entries):\n", nbr_entries);
-
- for (i = 0; i < nbr_entries; i++)
- {
- unsigned char ent[8];
- int pos;
-
- if (fread (ent, sizeof (ent), 1, h->stream) != 1)
- return -1;
-
- pos = ghw_get_i32 (h, &ent[4]);
- if (h->flag_verbose)
- printf (" %s at %d\n", ent, pos);
- }
-
- if (fread (hdr, 4, 1, h->stream) != 1)
- return -1;
- if (memcmp (hdr, "EOD", 4))
- return -1;
- return 0;
-}
-
-int
-ghw_read_tailer (struct ghw_handler *h)
-{
- unsigned char hdr[8];
- int pos;
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- return -1;
-
- pos = ghw_get_i32 (h, &hdr[4]);
-
- if (h->flag_verbose)
- printf ("Tailer: directory at %d\n", pos);
- return 0;
-}
-
-enum ghw_res
-ghw_read_sm_hdr (struct ghw_handler *h, int *list)
-{
- unsigned char hdr[4];
- int res;
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- {
- if (feof (h->stream))
- return ghw_res_eof;
- else
- return ghw_res_error;
- }
- if (memcmp (hdr, "SNP", 4) == 0)
- {
- res = ghw_read_snapshot (h);
- if (res < 0)
- return res;
- return ghw_res_snapshot;
- }
- else if (memcmp (hdr, "CYC", 4) == 0)
- {
- res = ghw_read_cycle_start (h);
- if (res < 0)
- return res;
- res = ghw_read_cycle_cont (h, list);
- if (res < 0)
- return res;
-
- return ghw_res_cycle;
- }
- else if (memcmp (hdr, "DIR", 4) == 0)
- {
- res = ghw_read_directory (h);
- }
- else if (memcmp (hdr, "TAI", 4) == 0)
- {
- res = ghw_read_tailer (h);
- }
- else
- {
- fprintf (stderr, "unknown GHW section %c%c%c%c\n",
- hdr[0], hdr[1], hdr[2], hdr[3]);
- return -1;
- }
- if (res != 0)
- return res;
- return ghw_res_other;
-}
-
-int
-ghw_read_sm (struct ghw_handler *h, enum ghw_sm_type *sm)
-{
- int res;
-
- while (1)
- {
- /* printf ("sm: state = %d\n", *sm); */
- switch (*sm)
- {
- case ghw_sm_init:
- case ghw_sm_sect:
- res = ghw_read_sm_hdr (h, NULL);
- switch (res)
- {
- case ghw_res_other:
- break;
- case ghw_res_snapshot:
- *sm = ghw_sm_sect;
- return res;
- case ghw_res_cycle:
- *sm = ghw_sm_cycle;
- return res;
- default:
- return res;
- }
- break;
- case ghw_sm_cycle:
- if (0)
- printf ("Time is " GHWPRI64 " fs\n", h->snap_time);
- if (0)
- ghw_disp_values (h);
-
- res = ghw_read_cycle_next (h);
- if (res < 0)
- return res;
- if (res == 1)
- {
- res = ghw_read_cycle_cont (h, NULL);
- if (res < 0)
- return res;
- return ghw_res_cycle;
- }
- res = ghw_read_cycle_end (h);
- if (res < 0)
- return res;
- *sm = ghw_sm_sect;
- break;
- }
- }
-}
-
-int
-ghw_read_cycle (struct ghw_handler *h)
-{
- int res;
-
- res = ghw_read_cycle_start (h);
- if (res < 0)
- return res;
- while (1)
- {
- res = ghw_read_cycle_cont (h, NULL);
- if (res < 0)
- return res;
-
- if (0)
- printf ("Time is " GHWPRI64 " fs\n", h->snap_time);
- if (0)
- ghw_disp_values (h);
-
-
- res = ghw_read_cycle_next (h);
- if (res < 0)
- return res;
- if (res == 0)
- break;
- }
- res = ghw_read_cycle_end (h);
- return res;
-}
-
-int
-ghw_read_dump (struct ghw_handler *h)
-{
- unsigned char hdr[4];
- int res;
-
- while (1)
- {
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- {
- if (feof (h->stream))
- return 0;
- else
- return -1;
- }
- if (memcmp (hdr, "SNP", 4) == 0)
- {
- res = ghw_read_snapshot (h);
- if (0 && res >= 0)
- ghw_disp_values (h);
- }
- else if (memcmp (hdr, "CYC", 4) == 0)
- {
- res = ghw_read_cycle (h);
- }
- else if (memcmp (hdr, "DIR", 4) == 0)
- {
- res = ghw_read_directory (h);
- }
- else if (memcmp (hdr, "TAI", 4) == 0)
- {
- res = ghw_read_tailer (h);
- }
- else
- {
- fprintf (stderr, "unknown GHW section %c%c%c%c\n",
- hdr[0], hdr[1], hdr[2], hdr[3]);
- return -1;
- }
- if (res != 0)
- return res;
- }
-}
-
-struct ghw_section ghw_sections[] = {
- { "\0\0\0", NULL },
- { "STR", ghw_read_str },
- { "HIE", ghw_read_hie },
- { "TYP", ghw_read_type },
- { "WKT", ghw_read_wk_types },
- { "EOH", ghw_read_eoh },
- { "SNP", ghw_read_snapshot },
- { "CYC", ghw_read_cycle },
- { "DIR", ghw_read_directory },
- { "TAI", ghw_read_tailer }
-};
-
-int
-ghw_read_section (struct ghw_handler *h)
-{
- unsigned char hdr[4];
- unsigned i;
-
- if (fread (hdr, sizeof (hdr), 1, h->stream) != 1)
- {
- if (feof (h->stream))
- return -2;
- else
- return -1;
- }
-
- for (i = 1; i < sizeof (ghw_sections) / sizeof (*ghw_sections); i++)
- if (memcmp (hdr, ghw_sections[i].name, 4) == 0)
- return i;
-
- fprintf (stderr, "ghw_read_section: unknown GHW section %c%c%c%c\n",
- hdr[0], hdr[1], hdr[2], hdr[3]);
- return 0;
-}
-
-void
-ghw_close (struct ghw_handler *h)
-{
- if (h->stream)
- {
- if (h->stream_ispipe)
- pclose (h->stream);
- else
- fclose (h->stream);
-
- h->stream = NULL;
- }
-}
-
-const char *
-ghw_get_dir (int is_downto)
-{
- return is_downto ? "downto" : "to";
-}
-
-void
-ghw_disp_range (union ghw_type *type, union ghw_range *rng)
-{
- switch (rng->kind)
- {
- case ghdl_rtik_type_b2:
- printf ("%s %s %s", ghw_get_lit (type, rng->b2.left),
- ghw_get_dir (rng->b2.dir), ghw_get_lit (type, rng->b2.right));
- break;
- case ghdl_rtik_type_e8:
- printf ("%s %s %s", ghw_get_lit (type, rng->e8.left),
- ghw_get_dir (rng->e8.dir), ghw_get_lit (type, rng->e8.right));
- break;
- case ghdl_rtik_type_i32:
- case ghdl_rtik_type_p32:
- printf (GHWPRI32 " %s " GHWPRI32,
- rng->i32.left, ghw_get_dir (rng->i32.dir), rng->i32.right);
- break;
- case ghdl_rtik_type_i64:
- case ghdl_rtik_type_p64:
- printf (GHWPRI64 " %s " GHWPRI64,
- rng->i64.left, ghw_get_dir (rng->i64.dir), rng->i64.right);
- break;
- case ghdl_rtik_type_f64:
- printf ("%g %s %g",
- rng->f64.left, ghw_get_dir (rng->f64.dir), rng->f64.right);
- break;
- default:
- printf ("?(%d)", rng->kind);
- }
-}
-
-static void
-ghw_disp_array_subtype_bounds (struct ghw_subtype_array *a)
-{
- unsigned i;
- struct ghw_type_array *base =
- (struct ghw_type_array *)ghw_get_base_type (a->base);
-
- printf (" (");
- for (i = 0; i < base->nbr_dim; i++)
- {
- if (i != 0)
- printf (", ");
- ghw_disp_range (base->dims[i], a->rngs[i]);
- }
- printf (")");
-}
-
-static void
-ghw_disp_record_subtype_bounds (struct ghw_subtype_record *sr)
-{
- struct ghw_type_record *base = sr->base;
- int is_first = 1;
- unsigned i;
-
- for (i = 0; i < base->nbr_fields; i++)
- {
- if (sr->els[i].type != base->els[i].type)
- {
- if (is_first)
- {
- printf ("(");
- is_first = 0;
- }
- else
- printf (", ");
- printf ("%s", base->els[i].name);
- switch (sr->els[i].type->kind)
- {
- case ghdl_rtik_subtype_array:
- ghw_disp_array_subtype_bounds (&sr->els[i].type->sa);
- break;
- case ghdl_rtik_subtype_record:
- ghw_disp_record_subtype_bounds (&sr->els[i].type->sr);
- break;
- default:
- printf ("??? (%d)", sr->els[i].type->kind);
- }
- }
- }
- if (!is_first)
- printf (")");
-}
-
-static void
-ghw_disp_subtype_definition (struct ghw_handler *h, union ghw_type *t)
-{
- switch (t->kind)
- {
- case ghdl_rtik_subtype_scalar:
- {
- struct ghw_subtype_scalar *s = &t->ss;
- ghw_disp_typename (h, s->base);
- printf (" range ");
- ghw_disp_range (s->base, s->rng);
- }
- break;
- case ghdl_rtik_subtype_array:
- {
- struct ghw_subtype_array *a = &t->sa;
-
- ghw_disp_typename (h, (union ghw_type *)a->base);
- ghw_disp_array_subtype_bounds (a);
- }
- break;
- case ghdl_rtik_subtype_record:
- {
- struct ghw_subtype_record *sr = &t->sr;
-
- ghw_disp_typename (h, (union ghw_type *)sr->base);
- ghw_disp_record_subtype_bounds (sr);
- }
- break;
- case ghdl_rtik_subtype_unbounded_array:
- {
- struct ghw_subtype_unbounded_record *sur = &t->sur;
-
- ghw_disp_typename (h, (union ghw_type *)sur->base);
- }
- break;
- default:
- printf ("ghw_disp_subtype_definition: unhandled type kind %d\n",
- t->kind);
- }
-}
-
-static int
-ghw_is_anonymous_type (struct ghw_handler *h, union ghw_type *t)
-{
- return t->common.name == h->str_table[0];
-}
-
-void
-ghw_disp_subtype_indication (struct ghw_handler *h, union ghw_type *t)
-{
- if (ghw_is_anonymous_type (h, t))
- {
- /* Anonymous subtype. */
- ghw_disp_subtype_definition (h, t);
- }
- else
- ghw_disp_typename (h, t);
-}
-
-void
-ghw_disp_type (struct ghw_handler *h, union ghw_type *t)
-{
- switch (t->kind)
- {
- case ghdl_rtik_type_b2:
- case ghdl_rtik_type_e8:
- {
- struct ghw_type_enum *e = &t->en;
- unsigned i;
-
- printf ("type %s is (", e->name);
- for (i = 0; i < e->nbr; i++)
- {
- if (i != 0)
- printf (", ");
- printf ("%s", e->lits[i]);
- }
- printf (");");
- if (e->wkt != ghw_wkt_unknown)
- printf (" -- WKT:%d", e->wkt);
- printf ("\n");
- }
- break;
- case ghdl_rtik_type_i32:
- case ghdl_rtik_type_f64:
- {
- struct ghw_type_scalar *s = &t->sc;
- printf ("type %s is range <>;\n", s->name);
- }
- break;
- case ghdl_rtik_type_p32:
- case ghdl_rtik_type_p64:
- {
- unsigned i;
-
- struct ghw_type_physical *p = &t->ph;
- printf ("type %s is range <> units\n", p->name);
- for (i = 0; i < p->nbr_units; i++)
- {
- struct ghw_unit *u = &p->units[i];
- printf (" %s = " GHWPRI64 " %s;\n",
- u->name, u->val, p->units[0].name);
- }
- printf ("end units\n");
- }
- break;
- case ghdl_rtik_type_array:
- {
- struct ghw_type_array *a = &t->ar;
- unsigned i;
-
- printf ("type %s is array (", a->name);
- for (i = 0; i < a->nbr_dim; i++)
- {
- if (i != 0)
- printf (", ");
- ghw_disp_typename (h, a->dims[i]);
- printf (" range <>");
- }
- printf (") of ");
- ghw_disp_subtype_indication (h, a->el);
- printf (";\n");
- }
- break;
- case ghdl_rtik_type_record:
- {
- struct ghw_type_record *r = &t->rec;
- unsigned i;
-
- printf ("type %s is record\n", r->name);
- for (i = 0; i < r->nbr_fields; i++)
- {
- printf (" %s: ", r->els[i].name);
- ghw_disp_subtype_indication (h, r->els[i].type);
- printf (";\n");
- }
- printf ("end record;\n");
- }
- break;
- case ghdl_rtik_subtype_array:
- case ghdl_rtik_subtype_scalar:
- case ghdl_rtik_subtype_record:
- case ghdl_rtik_subtype_unbounded_array:
- {
- struct ghw_type_common *c = &t->common;
- printf ("subtype %s is ", c->name);
- ghw_disp_subtype_definition (h, t);
- printf (";\n");
- }
- break;
- default:
- printf ("ghw_disp_type: unhandled type kind %d\n", t->kind);
- }
-}
-
-void
-ghw_disp_types (struct ghw_handler *h)
-{
- unsigned i;
-
- for (i = 0; i < h->nbr_types; i++)
- if (h->flag_verbose || !ghw_is_anonymous_type (h, h->types[i]))
- ghw_disp_type (h, h->types[i]);
-}
diff --git a/src/grt/ghwlib.h b/src/grt/ghwlib.h
deleted file mode 100644
index df3c20a54..000000000
--- a/src/grt/ghwlib.h
+++ /dev/null
@@ -1,465 +0,0 @@
-/* GHDL Wavefile reader library.
- Copyright (C) 2005-2017 Tristan Gingold
-
- This program 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 of the License, or
- (at your option) any later version.
-
- This program 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 this program. If not, see <gnu.org/licenses>.
-*/
-
-
-#ifndef _GHWLIB_H_
-#define _GHWLIB_H_
-
-#include <stdio.h>
-#include <stdlib.h>
-
-/* To be libraries friendly. */
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-/* The ghwlib uses the standard c99 int32_t and int64_t. They are declared
- in stdint.h. Header inttypes.h includes stdint.h and provides macro for
- printf and co specifiers. Use it if known to be available. */
-
-#if defined(__cplusplus) \
- || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) \
- || defined(HAVE_INTTYPES_H)
-/* Use C99 standard header. */
-# include <inttypes.h>
-# define GHWPRI64 "%"PRId64
-# define GHWPRI32 "%"PRId32
-#else
-# include <stdint.h>
-# define GHWPRI64 "%lld"
-# define GHWPRI32 "%d"
-#endif
-
-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, /* Obsolete. */
- ghdl_rtik_subtype_unbounded_array,
- ghdl_rtik_subtype_record,
- ghdl_rtik_subtype_unbounded_record,
-#if 0
- ghdl_rtik_subtype_access, /* 40 */
- ghdl_rtik_type_protected,
- ghdl_rtik_element,
- ghdl_rtik_unit,
- ghdl_rtik_attribute_transaction,
- ghdl_rtik_attribute_quiet,
- ghdl_rtik_attribute_stable,
-#endif
- 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_b2
-{
- enum ghdl_rtik kind : 8;
- int dir : 8; /* 0: to, !0: downto. */
- unsigned char left;
- unsigned char right;
-};
-
-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_b2 b2;
- 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;
- unsigned 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;
-
- unsigned int nbr_dim;
- union ghw_type *el;
- union ghw_type **dims;
-};
-
-struct ghw_subtype_unbounded_array
-{
- enum ghdl_rtik kind;
- const char *name;
-
- union ghw_type *base;
-};
-
-struct ghw_subtype_array
-{
- enum ghdl_rtik kind;
- const char *name;
-
- union ghw_type *base;
- int nbr_scalars;
- union ghw_range **rngs;
- union ghw_type *el;
-};
-
-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;
-
- unsigned int nbr_fields;
- int nbr_scalars; /* Number of scalar elements (ie nbr of signals). */
- struct ghw_record_element *els;
-};
-
-struct ghw_subtype_record
-{
- enum ghdl_rtik kind;
- const char *name;
-
- struct ghw_type_record *base;
- int nbr_scalars; /* Number of scalar elements (ie nbr of signals). */
- struct ghw_record_element *els;
-};
-
-struct ghw_subtype_unbounded_record
-{
- enum ghdl_rtik kind;
- const char *name;
-
- struct ghw_type_record *base;
-};
-
-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_type_array ar;
- struct ghw_type_record rec;
- struct ghw_subtype_array sa;
- struct ghw_subtype_unbounded_array sua;
- struct ghw_subtype_record sr;
- struct ghw_subtype_unbounded_record sur;
-};
-
-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_package = 7,
- 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
-};
-
-#define GHW_NO_SIG 0
-
-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 GHW_NO_SIG (0). */
- unsigned int *sigs;
- } sig;
- } u;
-};
-
-struct ghw_handler
-{
- FILE *stream;
- /* True if STREAM was popen, else was fopen. */
- unsigned char stream_ispipe;
- /* True if words are big-endian. */
- unsigned char word_be;
- unsigned char word_len;
- unsigned char off_len;
- /* Minor version. */
- int version;
-
- /* Set by user. */
- int flag_verbose;
-
- /* String table. */
- /* Number of strings. */
- unsigned nbr_str;
- /* Size of the strings (without nul). */
- unsigned str_size;
- /* String table. */
- char **str_table;
- /* Array containing strings. */
- char *str_content;
-
- /* Type table. */
- unsigned nbr_types;
- union ghw_type **types;
-
- /* Non-composite (or basic) signals. */
- unsigned nbr_sigs;
- char *skip_sigs;
- int flag_full_names;
- 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);
-
-/* Return base type of T. */
-union ghw_type *ghw_get_base_type (union ghw_type *t);
-
-/* Return length of RNG. */
-int ghw_get_range_length (union ghw_range *rng);
-
-/* 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_filter_signals (struct ghw_handler *h, int *signals_to_keep, int nb_signals_to_keep);
-
-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
-};
-
-enum ghw_res ghw_read_sm_hdr (struct ghw_handler *h, int *list);
-
-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_subtype_indication (struct ghw_handler *h, union ghw_type *t);
-
-/* Note: TYPE must be a base type (used only to display literals). */
-void ghw_disp_range (union ghw_type *type, 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_ */