Fix GitHub issue #315 - support modpath delays on multiply-driven nets.
This commit is contained in:
parent
f76e1c1ecb
commit
a44ffe5746
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2017 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2020 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -722,9 +722,9 @@ static void draw_net_input_x(ivl_nexus_t nex,
|
||||||
char*nex_str = draw_net_input_drive(nex, drivers[0]);
|
char*nex_str = draw_net_input_drive(nex, drivers[0]);
|
||||||
char modpath_label[64];
|
char modpath_label[64];
|
||||||
snprintf(modpath_label, sizeof modpath_label,
|
snprintf(modpath_label, sizeof modpath_label,
|
||||||
"V_%p/m", path_sig);
|
"V_%p_0/m", path_sig);
|
||||||
nex_private = strdup(modpath_label);
|
nex_private = strdup(modpath_label);
|
||||||
draw_modpath(path_sig, nex_str);
|
draw_modpath(path_sig, nex_str, 0);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
nex_private = draw_net_input_drive(nex, drivers[0]);
|
nex_private = draw_net_input_drive(nex, drivers[0]);
|
||||||
|
|
@ -745,8 +745,20 @@ static void draw_net_input_x(ivl_nexus_t nex,
|
||||||
}
|
}
|
||||||
|
|
||||||
driver_labels = malloc(ndrivers * sizeof(char*));
|
driver_labels = malloc(ndrivers * sizeof(char*));
|
||||||
for (idx = 0; idx < ndrivers; idx += 1) {
|
ivl_signal_t path_sig = find_modpath(nex);
|
||||||
driver_labels[idx] = draw_net_input_drive(nex, drivers[idx]);
|
if (path_sig) {
|
||||||
|
for (idx = 0; idx < ndrivers; idx += 1) {
|
||||||
|
char*nex_str = draw_net_input_drive(nex, drivers[idx]);
|
||||||
|
char modpath_label[64];
|
||||||
|
snprintf(modpath_label, sizeof modpath_label,
|
||||||
|
"V_%p_%u/m", path_sig, idx);
|
||||||
|
driver_labels[idx] = strdup(modpath_label);
|
||||||
|
draw_modpath(path_sig, nex_str, idx);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (idx = 0; idx < ndrivers; idx += 1) {
|
||||||
|
driver_labels[idx] = draw_net_input_drive(nex, drivers[idx]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fprintf(vvp_out, "RS_%p .resolv %s", nex, resolv_type);
|
fprintf(vvp_out, "RS_%p .resolv %s", nex, resolv_type);
|
||||||
for (idx = 0; idx < ndrivers; idx += 1) {
|
for (idx = 0; idx < ndrivers; idx += 1) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007-2010 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2007-2020 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -127,16 +127,18 @@ static void draw_modpath_record(const char*label, const char*driver,
|
||||||
struct modpath_item {
|
struct modpath_item {
|
||||||
ivl_signal_t path_sig;
|
ivl_signal_t path_sig;
|
||||||
char*drive_label;
|
char*drive_label;
|
||||||
|
unsigned drive_index;
|
||||||
struct modpath_item*next;
|
struct modpath_item*next;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct modpath_item*modpath_list = 0;
|
static struct modpath_item*modpath_list = 0;
|
||||||
|
|
||||||
void draw_modpath(ivl_signal_t path_sig, char*drive_label)
|
void draw_modpath(ivl_signal_t path_sig, char*drive_label, unsigned drive_index)
|
||||||
{
|
{
|
||||||
struct modpath_item*cur = calloc(1, sizeof(struct modpath_item));
|
struct modpath_item*cur = calloc(1, sizeof(struct modpath_item));
|
||||||
cur->path_sig = path_sig;
|
cur->path_sig = path_sig;
|
||||||
cur->drive_label = drive_label;
|
cur->drive_label = drive_label;
|
||||||
|
cur->drive_index = drive_index;
|
||||||
cur->next = modpath_list;
|
cur->next = modpath_list;
|
||||||
modpath_list = cur;
|
modpath_list = cur;
|
||||||
}
|
}
|
||||||
|
|
@ -149,7 +151,7 @@ void cleanup_modpath(void)
|
||||||
|
|
||||||
modpath_list = cur->next;
|
modpath_list = cur->next;
|
||||||
|
|
||||||
snprintf(modpath_label, sizeof modpath_label, "V_%p/m", cur->path_sig);
|
snprintf(modpath_label, sizeof modpath_label, "V_%p_%u/m", cur->path_sig, cur->drive_index);
|
||||||
draw_modpath_record(modpath_label, cur->drive_label, cur->path_sig);
|
draw_modpath_record(modpath_label, cur->drive_label, cur->path_sig);
|
||||||
free(cur->drive_label);
|
free(cur->drive_label);
|
||||||
free(cur);
|
free(cur);
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef IVL_vvp_priv_H
|
#ifndef IVL_vvp_priv_H
|
||||||
#define IVL_vvp_priv_H
|
#define IVL_vvp_priv_H
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2001-2014 Stephen Williams (steve@icarus.com)
|
* Copyright (c) 2001-2020 Stephen Williams (steve@icarus.com)
|
||||||
*
|
*
|
||||||
* This source code is free software; you can redistribute it
|
* This source code is free software; you can redistribute it
|
||||||
* and/or modify it in source code form under the terms of the GNU
|
* and/or modify it in source code form under the terms of the GNU
|
||||||
|
|
@ -120,7 +120,7 @@ extern char* process_octal_codes(const char*txt, unsigned wid);
|
||||||
* Note: draw_modpath drive_label must be malloc'ed by the
|
* Note: draw_modpath drive_label must be malloc'ed by the
|
||||||
* caller. This function will free the string sometime in the future.
|
* caller. This function will free the string sometime in the future.
|
||||||
*/
|
*/
|
||||||
extern void draw_modpath(ivl_signal_t path_sig, char*drive_label);
|
extern void draw_modpath(ivl_signal_t path_sig, char*drive_label, unsigned drive_index);
|
||||||
extern void cleanup_modpath(void);
|
extern void cleanup_modpath(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue