⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gens.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
#include "spice.h"#include "util.h"#include "misc.h"#include "ifsim.h"#include "gendefs.h"#include "cktdefs.h"#include "cpstd.h"#include "ftedefs.h"#include "fteext.h"#include "devdefs.h"#include "dgen.h"static void dgen_next( );wl_forall(wl, fn, data)	wordlist	*wl;	int		(*fn)( );	char		*data;{	while (wl) {		(*fn)(wl, data);		wl = wl->wl_next;	}}dgen *dgen_init(ckt, wl, nomix, flag, model)	GENcircuit	*ckt;	wordlist	*wl;	int		nomix;	int		flag;	int		model;{	dgen	*dg;	wordlist *w, **prevp;	dg = NEW(dgen);	dg->ckt = ckt;	dg->instance = NULL;	dg->model = NULL;	dg->dev_type_no = -1;	dg->dev_list = wl;	dg->flags = 0;	prevp = &wl;#ifdef notdef	for (w = wl; w; w = w->wl_next) {		if (!strcmp(w->wl_word, "#")) {			model = 1;			*prevp = w->wl_next;			flag |= DGEN_DEFDEVS;		} else if (index(w->wl_word, '#'))			model = 1;		else			instance = 1;		prevp = &w->wl_next;	}	if (instance && model) {		fprintf(stderr,			"Error: can't mix instances and models");		tfree(dg);		return NULL;	}#endif	if (model)		dg->flags = (DGEN_ALL & ~ DGEN_INSTANCE) | DGEN_INIT;	else		dg->flags = DGEN_ALL | DGEN_INIT;	if (wl)		dg->flags |= flag;	else		dg->flags |= DGEN_DEFDEVS | flag;	dgen_next(&dg);	return dg;}intdgen_for_n(dg, n, fn, data, subindex)	dgen	*dg;	int	n;	int	(*fn)( );	char	*data;	int	subindex;{	dgen	dgx, *dgxp;	int	dnum, i, j, k;	dgxp = &dgx;	bcopy(dg, dgxp, sizeof(dgx));	dnum = dgxp->dev_type_no;	k = 0;	for (i = 0; dgxp && dgxp->dev_type_no == dnum && i < n; i++) {		/*printf("Loop at %d\n", i);*/		j = (*fn)(dgxp, data, subindex);		if (j > k)			k = j;		dgen_next(&dgxp);	}	return k - subindex;}dgen_nth_next(dg, n)	dgen	**dg;	int	n;{	int	i, dnum;	dnum = (*dg)->dev_type_no;	for (i = 0; *dg && (*dg)->dev_type_no == dnum && i < n; i++) {		dgen_next(dg);	}}static voiddgen_next(dgx)	dgen	**dgx;{	int	done;	dgen	*dg;	char	*p;	int	len, len2;	int	need;	int	i;	wordlist *w;	char	type, *subckt, *device, *model;	char	*Top_Level = "\001";	int	subckt_len;	int	head_match;	char	*word, *dev_name, *mod_name;	dg = *dgx;	if (!dg)		return;	/* Prime the "model only" or "device type only" iteration,	 * required because the filtering (below) may request additional	 * detail.	 */	if (!(dg->flags & DGEN_INSTANCE)) {		if (!(dg->flags & DGEN_MODEL))			dg->model = NULL;		dg->instance = NULL;	}	need = dg->flags;	done = 0;	while (!done) {		if (dg->instance) {			/* next instance */			dg->instance = dg->instance->GENnextInstance;		} else if (dg->model) {			dg->model = dg->model->GENnextModel;			if (dg->model)				dg->instance = dg->model->GENinstances;		} else if (dg->dev_type_no < DEVmaxnum) {			dg->dev_type_no += 1;			if (dg->dev_type_no < DEVmaxnum) {				dg->model = ((CKTcircuit *)					(dg->ckt))->CKThead[dg->dev_type_no];				if (dg->model)					dg->instance = dg->model->GENinstances;			} else {				done = 2;				break;			}		} else {			done = 2;			break;		}		if (need & DGEN_INSTANCE && !dg->instance)			continue;		if (need & DGEN_MODEL && !dg->model)			continue;#ifdef notdef		if (dg->instance)			printf("Maybe : %s\n", dg->instance->GENname);		if (dg->model)			printf("Maybe mod : %s\n", dg->model->GENmodName);#endif		/* Filter */		if (!dg->dev_list) {			if ((dg->flags & DGEN_ALLDEVS)				|| ((dg->flags & DGEN_DEFDEVS)				&& (ft_sim->devices[dg->dev_type_no]->flags				& DEV_DEFAULT)))			{				done = 1;			} else {				done = 0;			}			continue;		}		done = 0;		for (w = dg->dev_list; w && !done; w = w->wl_next) {			/* assume a match (have to reset done every time			 * through			 */			done = 1;			word = w->wl_word;			if (!word || !*word) {				break;			}			/* Break up word into type, subcircuit, model, device,			 * must be nodestructive to "word"			 */			/* type */			if (*word == ':' || *word == '#')				type = '\0';			else				type = *word++;			/* subcircuit */			subckt = word;			/* look for last ":" or "#" in word */			for (p = word + strlen(word) /* do '\0' first time */;				p != word && *p != ':' && *p != '#'; p--)			{				;			}			if (*p != ':' && *p != '#') {				/* No subcircuit name specified */				subckt = NULL;				subckt_len = 0;			} else {				if (p[-1] == ':') {					head_match = 1;					subckt_len = p - word - 1;				} else {					head_match = 0;					subckt_len = p - word;				}				if (subckt_len == 0) {					/* Top level only */					if (head_match)						subckt = NULL;					else						subckt = Top_Level;				}				word = p + 1;			}			/* model or device */			if (*p == '#') {				model = word;				device = NULL;			} else {				model = NULL;				device = word;			}			/* Now compare */#ifdef notdef			printf("Type: %c, subckt: %s, name: %s\n",				type ? type : '0', subckt, device);#endif			if (dg->instance)				dev_name = dg->instance->GENname;			else				dev_name = NULL;			if (dg->model)				mod_name = dg->model->GENmodName;			else				mod_name = NULL;			if (type) {				if (!dev_name) {					done = 0;					/*printf("No device.\n");*/					need |= DGEN_MODEL;					continue;				} else if (type != *dev_name) {					done = 0;					/*printf("Wrong type.\n");*/					/* Bleh ... plan breaks down here */					/* need = DGEN_TYPE; */					continue;				}			}			if (subckt == Top_Level) {				if (dev_name && dev_name[1] == ':') {					need |= DGEN_INSTANCE;					done = 0;					/*printf("Wrong level.\n");*/					continue;				}			} else if (subckt && (!dev_name				|| !ciprefix(subckt, dev_name + 1)))			{				need |= DGEN_INSTANCE;				done = 0;				/*printf("Wrong subckt.\n"); */				continue;			}			if (device && *device) {				need |= DGEN_INSTANCE | DGEN_MODEL;				if (!dev_name) {					done = 0;					/*printf("Didn't get dev name.\n");*/					continue;				} else if (strcmp(device,					dev_name + 1 + subckt_len))				{					done = 0;					/*printf("Wrong name.\n");*/					continue;				}			} else if (model && *model) {				if (strcmp(model, mod_name)) {					done = 0;					need |= DGEN_MODEL;					/*printf("Wrong model name.\n");*/					continue;				}			}			break;		}#ifdef notdef		if (done == 1)			printf("Accepted\n");		else			printf("Skipped\n");#endif	}	if (done == 2)		*dgx = NULL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -