Add drive 0/1 for $d_lo/$d_hi.
This commit is contained in:
parent
2e064db79a
commit
db81d7ca28
|
|
@ -297,6 +297,7 @@ static NAME_ENTRY port_names_list = NULL;
|
|||
static unsigned int num_name_collisions = 0;
|
||||
/* .model d_zero_inv99 d_inverter just once per subckt */
|
||||
static BOOL add_zero_delay_inverter_model = FALSE;
|
||||
static BOOL add_drive_hilo = FALSE;
|
||||
static char *current_subckt = NULL;
|
||||
static unsigned int subckt_msg_count = 0;
|
||||
|
||||
|
|
@ -720,6 +721,29 @@ struct card *replacement_udevice_cards(void)
|
|||
x = create_xlate_translated(".model d_zero_inv99 d_inverter");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
}
|
||||
if (add_drive_hilo) {
|
||||
x = create_xlate_translated(".subckt hilo_dollar___lo drive___0");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
x = create_xlate_translated("a1 0 drive___0 dbuf1");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
x = create_xlate_translated(".model dbuf1 d_buffer");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
x = create_xlate_translated(".ends hilo_dollar___lo");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
x = create_xlate_translated(".subckt hilo_dollar___hi drive___1");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
x = create_xlate_translated("a2 0 drive___1 dinv1");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
x = create_xlate_translated(".model dinv1 d_inverter");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
x = create_xlate_translated(".ends hilo_dollar___hi");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
x = create_xlate_translated("x8100000 hilo_drive___1 hilo_dollar___hi");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
x = create_xlate_translated("x8100001 hilo_drive___0 hilo_dollar___lo");
|
||||
translated_p = add_xlator(translated_p, x);
|
||||
|
||||
}
|
||||
for (x = first_xlator(translated_p); x; x = next_xlator(translated_p)) {
|
||||
if (ps_port_directions >= 2) {
|
||||
printf("TRANS_OUT %s\n", x->translated);
|
||||
|
|
@ -791,6 +815,7 @@ void initialize_udevice(char *subckt_line)
|
|||
(void) add_xlator(default_models, xdata);
|
||||
/* reset for the new subckt */
|
||||
add_zero_delay_inverter_model = FALSE;
|
||||
add_drive_hilo = FALSE;
|
||||
}
|
||||
|
||||
static void determine_port_type(void)
|
||||
|
|
@ -834,6 +859,7 @@ void cleanup_udevice(void)
|
|||
delete_xlator(default_models);
|
||||
default_models = NULL;
|
||||
add_zero_delay_inverter_model = FALSE;
|
||||
add_drive_hilo = FALSE;
|
||||
clear_name_list(input_names_list, "INPUT_PINS");
|
||||
input_names_list = NULL;
|
||||
clear_name_list(output_names_list, "OUTPUT_PINS");
|
||||
|
|
@ -2708,6 +2734,25 @@ static BOOL u_process_model(char *nline, char *original)
|
|||
return retval;
|
||||
}
|
||||
|
||||
static char *get_name_hilo(char *tok_str)
|
||||
{
|
||||
char *name = NULL;
|
||||
|
||||
if (eq(tok_str, "$d_hi")) {
|
||||
name = TMALLOC(char, strlen("hilo_drive___1") + 1);
|
||||
strcpy(name, "hilo_drive___1");
|
||||
add_drive_hilo = TRUE;
|
||||
} else if (eq(tok_str, "$d_lo")) {
|
||||
name = TMALLOC(char, strlen("hilo_drive___0") + 1);
|
||||
strcpy(name, "hilo_drive___0");
|
||||
add_drive_hilo = TRUE;
|
||||
} else {
|
||||
name = TMALLOC(char, strlen(tok_str) + 1);
|
||||
(void) memcpy(name, tok_str, strlen(tok_str) + 1);
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
static struct dff_instance *add_dff_inout_timing_model(
|
||||
struct instance_hdr *hdr, char *start)
|
||||
{
|
||||
|
|
@ -2735,9 +2780,7 @@ static struct dff_instance *add_dff_inout_timing_model(
|
|||
arrp = dffip->d_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
tok = strtok(NULL, " \t");
|
||||
name = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(name, tok, strlen(tok) + 1);
|
||||
arrp[i] = name;
|
||||
arrp[i] = get_name_hilo(tok);
|
||||
}
|
||||
/* q_out outputs */
|
||||
dffip->q_out = TMALLOC(char *, num_gates);
|
||||
|
|
@ -2766,7 +2809,7 @@ static struct dff_instance *add_dff_inout_timing_model(
|
|||
/* Reject incompatible inputs */
|
||||
arrp = dffip->d_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
if (strncmp(arrp[i], "$d_", 3) == 0) {
|
||||
if (eq(arrp[i], "$d_nc")) {
|
||||
delete_dff_instance(dffip);
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -2795,7 +2838,7 @@ static struct dltch_instance *add_dltch_inout_timing_model(
|
|||
dlp->num_gates = num_gates;
|
||||
copyline = TMALLOC(char, strlen(start) + 1);
|
||||
(void) memcpy(copyline, start, strlen(start) + 1);
|
||||
/* prebar, clrbar, clk */
|
||||
/* prebar, clrbar, clk(gate) */
|
||||
tok = strtok(copyline, " \t");
|
||||
dlp->prebar = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(dlp->prebar, tok, strlen(tok) + 1);
|
||||
|
|
@ -2803,16 +2846,14 @@ static struct dltch_instance *add_dltch_inout_timing_model(
|
|||
dlp->clrbar = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(dlp->clrbar, tok, strlen(tok) + 1);
|
||||
tok = strtok(NULL, " \t");
|
||||
dlp->gate = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(dlp->gate, tok, strlen(tok) + 1);
|
||||
dlp->gate = get_name_hilo(tok);
|
||||
|
||||
/* d inputs */
|
||||
dlp->d_in = TMALLOC(char *, num_gates);
|
||||
arrp = dlp->d_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
tok = strtok(NULL, " \t");
|
||||
name = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(name, tok, strlen(tok) + 1);
|
||||
arrp[i] = name;
|
||||
arrp[i] = get_name_hilo(tok);
|
||||
}
|
||||
/* q_out outputs */
|
||||
dlp->q_out = TMALLOC(char *, num_gates);
|
||||
|
|
@ -2841,12 +2882,12 @@ static struct dltch_instance *add_dltch_inout_timing_model(
|
|||
/* Reject incompatible inputs */
|
||||
arrp = dlp->d_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
if (strncmp(arrp[i], "$d_", 3) == 0) {
|
||||
if (eq(arrp[i], "$d_nc")) {
|
||||
delete_dltch_instance(dlp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (strncmp(dlp->gate, "$d_", 3) == 0) {
|
||||
if (eq(dlp->gate, "$d_nc")) {
|
||||
delete_dltch_instance(dlp);
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -2888,18 +2929,14 @@ static struct jkff_instance *add_jkff_inout_timing_model(
|
|||
arrp = jkffip->j_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
tok = strtok(NULL, " \t");
|
||||
name = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(name, tok, strlen(tok) + 1);
|
||||
arrp[i] = name;
|
||||
arrp[i] = get_name_hilo(tok);
|
||||
}
|
||||
/* k inputs */
|
||||
jkffip->k_in = TMALLOC(char *, num_gates);
|
||||
arrp = jkffip->k_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
tok = strtok(NULL, " \t");
|
||||
name = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(name, tok, strlen(tok) + 1);
|
||||
arrp[i] = name;
|
||||
arrp[i] = get_name_hilo(tok);
|
||||
}
|
||||
/* q_out outputs */
|
||||
jkffip->q_out = TMALLOC(char *, num_gates);
|
||||
|
|
@ -2929,8 +2966,7 @@ static struct jkff_instance *add_jkff_inout_timing_model(
|
|||
arrp = jkffip->j_in;
|
||||
arrpk = jkffip->k_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
if (strncmp(arrp[i], "$d_", 3) == 0 ||
|
||||
strncmp(arrpk[i], "$d_", 3) == 0) {
|
||||
if (eq(arrp[i], "$d_nc") || eq(arrpk[i], "$d_nc")) {
|
||||
delete_jkff_instance(jkffip);
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -2969,26 +3005,21 @@ static struct srff_instance *add_srff_inout_timing_model(
|
|||
(void) memcpy(srffp->clrbar, tok, strlen(tok) + 1);
|
||||
|
||||
tok = strtok(NULL, " \t");
|
||||
srffp->gate = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(srffp->gate, tok, strlen(tok) + 1);
|
||||
srffp->gate = get_name_hilo(tok);
|
||||
|
||||
/* s inputs */
|
||||
srffp->s_in = TMALLOC(char *, num_gates);
|
||||
arrp = srffp->s_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
tok = strtok(NULL, " \t");
|
||||
name = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(name, tok, strlen(tok) + 1);
|
||||
arrp[i] = name;
|
||||
arrp[i] = get_name_hilo(tok);
|
||||
}
|
||||
/* r inputs */
|
||||
srffp->r_in = TMALLOC(char *, num_gates);
|
||||
arrp = srffp->r_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
tok = strtok(NULL, " \t");
|
||||
name = TMALLOC(char, strlen(tok) + 1);
|
||||
(void) memcpy(name, tok, strlen(tok) + 1);
|
||||
arrp[i] = name;
|
||||
arrp[i] = get_name_hilo(tok);
|
||||
}
|
||||
/* q_out outputs */
|
||||
srffp->q_out = TMALLOC(char *, num_gates);
|
||||
|
|
@ -3018,13 +3049,12 @@ static struct srff_instance *add_srff_inout_timing_model(
|
|||
arrp = srffp->s_in;
|
||||
arrpr = srffp->r_in;
|
||||
for (i = 0; i < num_gates; i++) {
|
||||
if (strncmp(arrp[i], "$d_", 3) == 0 ||
|
||||
strncmp(arrpr[i], "$d_", 3) == 0) {
|
||||
if (eq(arrp[i], "$d_nc") || eq(arrpr[i], "$d_nc")) {
|
||||
delete_srff_instance(srffp);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if (strncmp(srffp->gate, "$d_", 3) == 0) {
|
||||
if (eq(srffp->gate, "$d_nc")) {
|
||||
delete_srff_instance(srffp);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue