From 18e17cefdfe4eed43e783e0626259b081cc59b83 Mon Sep 17 00:00:00 2001 From: Brian Taylor Date: Sat, 7 May 2022 22:12:09 -0700 Subject: [PATCH] Add pullup/down. Skip spurious '*' line. --- src/frontend/inpcom.c | 15 +++++++++++---- src/frontend/udevices.c | 42 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index e5a19948d..e35848df6 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -8287,7 +8287,7 @@ static void rem_double_braces(struct card* newcard) } #ifdef INTEGRATE_UDEVICES -/* +#ifdef TRACE static void list_the_cards(struct card *startcard, char *prefix) { struct card *card; @@ -8297,7 +8297,7 @@ static void list_the_cards(struct card *startcard, char *prefix) printf("%s %s\n", prefix, cut_line); } } -*/ +#endif static struct card *the_last_card(struct card *startcard) { @@ -8418,7 +8418,9 @@ static struct card *u_instances(struct card *startcard) } } } else { - udev_not_ok++; + if (!ciprefix("*", cut_line)) { + udev_not_ok++; + } } if (!skip_next) { card = card->nextcard; @@ -8512,8 +8514,13 @@ static struct card *pspice_compat(struct card *oldcard) #ifdef INTEGRATE_UDEVICES { struct card *ucard; +#ifdef TRACE + list_the_cards(newcard, "Before udevices"); +#endif ucard = u_instances(newcard); - //list_the_cards(oldcard, "After udevices"); +#ifdef TRACE + list_the_cards(oldcard, "After udevices"); +#endif } #endif diff --git a/src/frontend/udevices.c b/src/frontend/udevices.c index 477e53e42..8c6f15065 100644 --- a/src/frontend/udevices.c +++ b/src/frontend/udevices.c @@ -282,10 +282,8 @@ static char *find_xspice_for_delay(char *itype) break; } case 'p': { -/* Not implemented if (strcmp(itype, "pulldn") == 0) { return xspice_tab[D_DOWN]; } if (strcmp(itype, "pullup") == 0) { return xspice_tab[D_UP]; } -*/ break; } case 's': { @@ -2625,6 +2623,44 @@ static char *skip_past_words(char *start, int count) return p1; } +static Xlatorp translate_pull(struct instance_hdr *hdr, char *start) +{ + char *itype, *xspice, *iname, *newline = NULL, *tok; + char *model_name, *inst_stmt, *model_stmt; + int i, numpulls; + Xlatorp xp = NULL; + Xlatep xdata = NULL; + + itype = hdr->instance_type; + iname = hdr->instance_name; + numpulls = hdr->num1; + xp = create_xlator(); + /* pull devices do not have a timing model, just need the xspice name */ + xspice = find_xspice_for_delay(itype); + newline = TMALLOC(char, strlen(start) + 1); + (void) memcpy(newline, start, strlen(start) + 1); + model_name = tprintf("d_%s%s", iname, itype); + for (i = 0; i < numpulls; i++) { + if (i == 0) { + tok = strtok(newline, " \t"); + } else { + tok = strtok(NULL, " \t"); + } + inst_stmt = tprintf("a%s_%d %s %s", iname, i, tok, model_name); + xdata = create_xlate_translated(inst_stmt); + xp = add_xlator(xp, xdata); + tfree(inst_stmt); + } + model_stmt = tprintf(".model %s %s(load = 1pf)", model_name, xspice); + xdata = create_xlate_translated(model_stmt); + xp = add_xlator(xp, xdata); + tfree(model_stmt); + tfree(model_name); + tfree(newline); + delete_instance_hdr(hdr); + return xp; +} + static Xlatorp translate_ff_latch(struct instance_hdr *hdr, char *start) { char *itype; @@ -2744,6 +2780,8 @@ BOOL u_process_instance(char *nline) } else if (strcmp(itype, "dff") == 0 || strcmp(itype, "jkff") == 0 || strcmp(itype, "dltch") == 0) { xp = translate_ff_latch(hdr, p1); + } else if (strcmp(itype, "pullup") == 0 || strcmp(itype, "pulldn") == 0) { + xp = translate_pull(hdr, p1); } else { delete_instance_hdr(hdr); retval = FALSE;