aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authortgingold <tgingold@users.noreply.github.com>2017-05-06 08:57:50 +0200
committerGitHub <noreply@github.com>2017-05-06 08:57:50 +0200
commitf250fb5c371ad8e286f4fe7c442ea7e7866f12a0 (patch)
treead89c6a28c4d83b02f6839394e16672b9bfab1aa /src
parent3031cd34237dd168a942c259d0fe0c26a5f5c87c (diff)
parent9d0c671751748ddafca1994e643bb1944c69f863 (diff)
downloadghdl-f250fb5c371ad8e286f4fe7c442ea7e7866f12a0.tar.gz
ghdl-f250fb5c371ad8e286f4fe7c442ea7e7866f12a0.tar.bz2
ghdl-f250fb5c371ad8e286f4fe7c442ea7e7866f12a0.zip
Merge pull request #338 from emogenet/master
Add -H to ghwdump to dump full pathnames of signals
Diffstat (limited to 'src')
-rw-r--r--src/grt/ghwdump.c14
-rw-r--r--src/grt/ghwlib.c60
-rw-r--r--src/grt/ghwlib.h1
3 files changed, 68 insertions, 7 deletions
diff --git a/src/grt/ghwdump.c b/src/grt/ghwdump.c
index 3b898d33d..d057b1004 100644
--- a/src/grt/ghwdump.c
+++ b/src/grt/ghwdump.c
@@ -34,6 +34,7 @@ usage (void)
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"
" -f <lst> list of signals to display (default: all, example: -f 1,3,5-7,21-33)\n"
@@ -133,6 +134,7 @@ main (int argc, char **argv)
int flag_disp_hierarchy;
int flag_disp_time;
int flag_disp_signals;
+ int flag_full_names;
int flag_list;
int flag_verbose;
int nb_signals;
@@ -144,6 +146,7 @@ main (int argc, char **argv)
progname = argv[0];
flag_disp_types = 0;
flag_disp_hierarchy = 0;
+ flag_full_names = 0;
flag_disp_time = 0;
flag_disp_signals = 0;
flag_list = 0;
@@ -156,7 +159,7 @@ main (int argc, char **argv)
{
int c;
- c = getopt (argc, argv, "thTslvf:");
+ c = getopt (argc, argv, "thHTslvf:");
if (c == -1)
break;
switch (c)
@@ -167,6 +170,10 @@ main (int argc, char **argv)
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;
@@ -252,7 +259,10 @@ main (int argc, char **argv)
if (flag_disp_types)
ghw_disp_types (hp);
if (flag_disp_hierarchy)
- ghw_disp_hie (hp, hp->hie);
+ {
+ hp->flag_full_names = flag_full_names;
+ ghw_disp_hie (hp, hp->hie);
+ }
#if 1
sm = ghw_sm_init;
diff --git a/src/grt/ghwlib.c b/src/grt/ghwlib.c
index bee84687c..7c5b80bd0 100644
--- a/src/grt/ghwlib.c
+++ b/src/grt/ghwlib.c
@@ -840,6 +840,7 @@ ghw_read_hie (struct ghw_handler *h)
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));
@@ -1004,6 +1005,55 @@ ghw_get_hie_name (struct ghw_hie *h)
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;
+
+ 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)
{
@@ -1017,8 +1067,9 @@ ghw_disp_hie (struct ghw_handler *h, struct ghw_hie *top)
while (1)
{
- for (i = 0; i < indent; i++)
- fputc (' ', stdout);
+ if (0 == h->flag_full_names)
+ for (i = 0; i < indent; i++)
+ fputc (' ', stdout);
printf ("%s", ghw_get_hie_name (hie));
switch (hie->kind)
@@ -1031,7 +1082,7 @@ ghw_disp_hie (struct ghw_handler *h, struct ghw_hie *top)
case ghw_hie_process:
case ghw_hie_package:
if (hie->name)
- printf (" %s", hie->name);
+ print_name (hie, h->flag_full_names);
if (hie->kind == ghw_hie_generate_for)
{
printf ("(");
@@ -1057,7 +1108,7 @@ ghw_disp_hie (struct ghw_handler *h, struct ghw_hie *top)
unsigned int *sigs = hie->u.sig.sigs;
unsigned int k, num;
- printf (" %s: ", hie->name);
+ print_name (hie, h->flag_full_names);
ghw_disp_subtype_indication (h, hie->u.sig.type);
printf (":");
k = 0;
@@ -1102,7 +1153,6 @@ ghw_read_eoh (struct ghw_handler *h)
return 0;
}
-
int
ghw_read_base (struct ghw_handler *h)
{
diff --git a/src/grt/ghwlib.h b/src/grt/ghwlib.h
index 11917542a..6f65d6ba8 100644
--- a/src/grt/ghwlib.h
+++ b/src/grt/ghwlib.h
@@ -333,6 +333,7 @@ struct ghw_handler
/* Non-composite (or basic) signals. */
int nbr_sigs;
char *skip_sigs;
+ int flag_full_names;
struct ghw_sig *sigs;
/* Hierarchy. */