diff --git a/src/ciderlib/oned/onedext.h b/src/ciderlib/oned/onedext.h index 9cd828d1c..8548e7b36 100644 --- a/src/ciderlib/oned/onedext.h +++ b/src/ciderlib/oned/onedext.h @@ -76,7 +76,7 @@ extern void ONEQrhsLoad(ONEdevice *); extern void ONEQcommonTerms(ONEdevice *); /*oneprint.c */ -extern void ONEprnSolution(FILE *, ONEdevice *, OUTPcard *); +extern void ONEprnSolution(FILE *, ONEdevice *, OUTPcard *, BOOLEAN, char *); extern void ONEmemStats(FILE *, ONEdevice *); extern void ONEcpuStats(FILE *f, ONEdevice *); diff --git a/src/ciderlib/oned/oneprint.c b/src/ciderlib/oned/oneprint.c index 9b6be01f1..41796f999 100644 --- a/src/ciderlib/oned/oneprint.c +++ b/src/ciderlib/oned/oneprint.c @@ -19,9 +19,9 @@ Author: 1992 David A. Gates, U. C. Berkeley CAD Group void -ONEprnSolution(FILE *file, ONEdevice *pDevice, OUTPcard *output) +ONEprnSolution(FILE *file, ONEdevice *pDevice, OUTPcard *output, BOOLEAN asciiSave, char *extra) { - int index, i; + int index, i, ii; int numVars = 0; ONEnode **nodeArray=NULL; ONEnode *pNode; @@ -114,7 +114,11 @@ ONEprnSolution(FILE *file, ONEdevice *pDevice, OUTPcard *output) /* Initialize rawfile */ numVars = output->OUTPnumVars; - fprintf(file, "Title: Device %s internal state\n", pDevice->name); + if (extra != NULL) { + fprintf(file, "Title: Device %s (%s) internal state\n", pDevice->name, extra); + } else { + fprintf(file, "Title: Device %s internal state\n", pDevice->name); + } fprintf(file, "Plotname: Device Cross Section\n"); fprintf(file, "Flags: real\n"); fprintf(file, "Command: deftype p xs cross\n"); @@ -186,7 +190,11 @@ ONEprnSolution(FILE *file, ONEdevice *pDevice, OUTPcard *output) if (output->OUTPmup) { fprintf(file, "\t%d mup mobility\n", numVars++); } - fprintf(file, "Binary:\n"); + if (asciiSave) { + fprintf(file, "Values:\n"); + } else { + fprintf(file, "Binary:\n"); + } for (index = 1; index <= pDevice->numNodes; index++) { pNode = nodeArray[index]; @@ -305,7 +313,16 @@ ONEprnSolution(FILE *file, ONEdevice *pDevice, OUTPcard *output) if (output->OUTPmup) { data[numVars++] = mup; } - fwrite(data, sizeof(double), (size_t) numVars, file); + if (asciiSave) { + for (ii = 0; ii < numVars; ii++) { + if (ii == 0) { + fprintf(file, "%d", index - 1); + } + fprintf(file, "\t%e\n", data[ii]); + } + } else { + fwrite(data, sizeof(double), (size_t) numVars, file); + } } FREE(nodeArray); } diff --git a/src/ciderlib/support/misc.c b/src/ciderlib/support/misc.c index 26bf61b77..e96ed0ff0 100644 --- a/src/ciderlib/support/misc.c +++ b/src/ciderlib/support/misc.c @@ -14,6 +14,7 @@ Author: 1992 David A. Gates, U. C. Berkeley CAD Group #include "ngspice/numenum.h" #include "ngspice/spmatrix.h" #include "ngspice/cidersupt.h" +#include "ngspice/cpextern.h" /* Used in Solution Projection Calculations */ @@ -161,3 +162,19 @@ foundError(int error) } return( matrixError ); } + +/* Return TRUE if the filetype variable matches the string 's' */ +BOOLEAN compareFiletypeVar(char *s) +{ + char buf[BSIZE_SP]; + + if (cp_getvar("filetype", CP_STRING, buf, sizeof(buf))) { + if (!strcmp(buf, s)) { + return TRUE; + } else { + return FALSE; + } + } else { + return FALSE; + } +} diff --git a/src/ciderlib/twod/twodext.h b/src/ciderlib/twod/twodext.h index c2adf9ee9..e4a3c2924 100644 --- a/src/ciderlib/twod/twodext.h +++ b/src/ciderlib/twod/twodext.h @@ -120,7 +120,7 @@ extern void TWOQrhsLoad(TWOdevice *); extern void TWOQcommonTerms(TWOdevice *); /*twoprint.c */ -extern void TWOprnSolution(FILE *, TWOdevice *, OUTPcard *); +extern void TWOprnSolution(FILE *, TWOdevice *, OUTPcard *, BOOLEAN, char *); extern void TWOmemStats(FILE *, TWOdevice *); extern void TWOcpuStats(FILE *, TWOdevice *); diff --git a/src/ciderlib/twod/twoprint.c b/src/ciderlib/twod/twoprint.c index 20d517a08..1a294a1bf 100644 --- a/src/ciderlib/twod/twoprint.c +++ b/src/ciderlib/twod/twoprint.c @@ -20,7 +20,7 @@ Author: 1992 David A. Gates, U. C. Berkeley CAD Group void -TWOprnSolution(FILE *file, TWOdevice *pDevice, OUTPcard *output) +TWOprnSolution(FILE *file, TWOdevice *pDevice, OUTPcard *output, BOOLEAN asciiSave, char *extra) { int index, xIndex, yIndex; int numVars = 0; @@ -34,6 +34,7 @@ TWOprnSolution(FILE *file, TWOdevice *pDevice, OUTPcard *output) double jcy, jdy, jny, jpy, jty; double *xScale = pDevice->xScale; double *yScale = pDevice->yScale; + int ii; if (output->OUTPnumVars == -1) { /* First pass. Need to count number of variables in output. */ @@ -123,7 +124,11 @@ TWOprnSolution(FILE *file, TWOdevice *pDevice, OUTPcard *output) /* Initialize rawfile */ numVars = output->OUTPnumVars; - fprintf(file, "Title: Device %s internal state\n", pDevice->name); + if (extra != NULL) { + fprintf(file, "Title: Device %s (%s) internal state\n", pDevice->name, extra); + } else { + fprintf(file, "Title: Device %s internal state\n", pDevice->name); + } fprintf(file, "Plotname: Device Cross Section\n"); fprintf(file, "Flags: real\n"); fprintf(file, "Command: deftype p xs cross\n"); @@ -205,7 +210,11 @@ TWOprnSolution(FILE *file, TWOdevice *pDevice, OUTPcard *output) if (output->OUTPmup) { fprintf(file, "\t%d mup mobility\n", numVars++); } - fprintf(file, "Binary:\n"); + if (asciiSave) { + fprintf(file, "Values:\n"); + } else { + fprintf(file, "Binary:\n"); + } for (xIndex = 1; xIndex <= pDevice->numXNodes; xIndex++) { for (yIndex = 1; yIndex <= pDevice->numYNodes; yIndex++) { @@ -215,8 +224,9 @@ TWOprnSolution(FILE *file, TWOdevice *pDevice, OUTPcard *output) /* Find the element to which this node belongs. */ for (index = 0; index < 4; index++) { pElem = pNode->pElems[index]; - if (pElem != NULL && pElem->evalNodes[(index + 2) % 4]) + if (pElem != NULL && pElem->evalNodes[(index + 2) % 4]) { break; + } } nodeFields(pElem, pNode, &ex, &ey); nodeCurrents(pElem, pNode, &mun, &mup, @@ -307,14 +317,32 @@ TWOprnSolution(FILE *file, TWOdevice *pDevice, OUTPcard *output) if (output->OUTPmup) { data[numVars++] = mup; } - fwrite(data, sizeof(double), (size_t) numVars, file); + if (asciiSave) { + for (ii = 0; ii < numVars; ii++) { + if (ii == 0) { + fprintf(file, "%d %d", yIndex, xIndex); + } + fprintf(file, "\t%e\n", data[ii]); + } + } else { + fwrite(data, sizeof(double), (size_t) numVars, file); + } } else { for (index = 0; index < output->OUTPnumVars; index++) { data[index] = 0.0; } data[0] = yScale[yIndex] * 1e-2; data[1] = xScale[xIndex] * 1e-2; - fwrite(data, sizeof(double), (size_t) numVars, file); + if (asciiSave) { + for (ii = 0; ii < numVars; ii++) { + if (ii == 0) { + fprintf(file, "%d %d", yIndex, xIndex); + } + fprintf(file, "\t%e\n", data[ii]); + } + } else { + fwrite(data, sizeof(double), (size_t) numVars, file); + } } } } diff --git a/src/include/ngspice/cidersupt.h b/src/include/ngspice/cidersupt.h index c7f79b101..fd26d80bf 100644 --- a/src/include/ngspice/cidersupt.h +++ b/src/include/ngspice/cidersupt.h @@ -87,6 +87,7 @@ extern double guessNewConc(double , double ); extern double lookup(double **, double ); extern BOOLEAN hasSORConverged(double *, double *, int); extern BOOLEAN foundError(int ); +extern BOOLEAN compareFiletypeVar(char *); diff --git a/src/spicelib/devices/nbjt/nbjtdump.c b/src/spicelib/devices/nbjt/nbjtdump.c index e53203c2b..db0cbb130 100644 --- a/src/spicelib/devices/nbjt/nbjtdump.c +++ b/src/spicelib/devices/nbjt/nbjtdump.c @@ -37,6 +37,7 @@ NBJTdump(GENmodel *inModel, CKTcircuit *ckt) char *prefix; int *state_num; int anyOutput = 0; + BOOLEAN writeAscii = TRUE; if (ckt->CKTmode & MODEDCOP) { prefix = "OP"; @@ -68,12 +69,15 @@ NBJTdump(GENmodel *inModel, CKTcircuit *ckt) anyOutput = 1; sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, *state_num, inst->NBJTname); - if ((fpState = fopen(fileName, "wb")) == NULL) { + + writeAscii = compareFiletypeVar("ascii"); + + if (!(fpState = fopen(fileName, (writeAscii ? "w" : "wb")))) { perror(fileName); } else { NBJTputHeader(fpState, ckt, inst); ONEprnSolution(fpState, inst->NBJTpDevice, - model->NBJToutputs); + model->NBJToutputs, writeAscii, "nbjt"); fclose(fpState); LOGmakeEntry(fileName, description); } diff --git a/src/spicelib/devices/nbjt2/nbt2dump.c b/src/spicelib/devices/nbjt2/nbt2dump.c index 2a13ce0f5..bd3d21a7e 100644 --- a/src/spicelib/devices/nbjt2/nbt2dump.c +++ b/src/spicelib/devices/nbjt2/nbt2dump.c @@ -38,6 +38,7 @@ NBJT2dump(GENmodel *inModel, CKTcircuit *ckt) char *prefix; int *state_num; int anyOutput = 0; + BOOLEAN writeAscii = TRUE; if (ckt->CKTmode & MODEDCOP) { prefix = "OP"; @@ -69,12 +70,15 @@ NBJT2dump(GENmodel *inModel, CKTcircuit *ckt) anyOutput = 1; sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, *state_num, inst->NBJT2name); - if ((fpState = fopen(fileName, "wb")) == NULL) { + + writeAscii = compareFiletypeVar("ascii"); + + if (!(fpState = fopen(fileName, (writeAscii ? "w" : "wb")))) { perror(fileName); } else { NBJT2putHeader(fpState, ckt, inst); TWOprnSolution(fpState, inst->NBJT2pDevice, - model->NBJT2outputs); + model->NBJT2outputs, writeAscii, "nbjt2"); fclose(fpState); LOGmakeEntry(fileName, description); } diff --git a/src/spicelib/devices/numd/numddump.c b/src/spicelib/devices/numd/numddump.c index 88b708abe..6d4c9ff3a 100644 --- a/src/spicelib/devices/numd/numddump.c +++ b/src/spicelib/devices/numd/numddump.c @@ -37,6 +37,7 @@ NUMDdump(GENmodel *inModel, CKTcircuit *ckt) char *prefix; int *state_num; int anyOutput = 0; + BOOLEAN writeAscii = TRUE; if (ckt->CKTmode & MODEDCOP) { prefix = "OP"; @@ -68,12 +69,15 @@ NUMDdump(GENmodel *inModel, CKTcircuit *ckt) anyOutput = 1; sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, *state_num, inst->NUMDname); - if ((fpState = fopen(fileName, "wb")) == NULL) { + + writeAscii = compareFiletypeVar("ascii"); + + if (!(fpState = fopen(fileName, (writeAscii ? "w" : "wb")))) { perror(fileName); } else { NUMDputHeader(fpState, ckt, inst); ONEprnSolution(fpState, inst->NUMDpDevice, - model->NUMDoutputs); + model->NUMDoutputs, writeAscii, "numd"); fclose(fpState); LOGmakeEntry(fileName, description); } diff --git a/src/spicelib/devices/numd2/nud2dump.c b/src/spicelib/devices/numd2/nud2dump.c index 6d9bd20fb..f4ed70de4 100644 --- a/src/spicelib/devices/numd2/nud2dump.c +++ b/src/spicelib/devices/numd2/nud2dump.c @@ -38,6 +38,7 @@ NUMD2dump(GENmodel *inModel, CKTcircuit *ckt) char *prefix; int *state_num; int anyOutput = 0; + BOOLEAN writeAscii = TRUE; if (ckt->CKTmode & MODEDCOP) { prefix = "OP"; @@ -69,12 +70,15 @@ NUMD2dump(GENmodel *inModel, CKTcircuit *ckt) anyOutput = 1; sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, *state_num, inst->NUMD2name); - if ((fpState = fopen(fileName, "wb")) == NULL) { + + writeAscii = compareFiletypeVar("ascii"); + + if (!(fpState = fopen(fileName, (writeAscii ? "w" : "wb")))) { perror(fileName); } else { NUMD2putHeader(fpState, ckt, inst); TWOprnSolution(fpState, inst->NUMD2pDevice, - model->NUMD2outputs); + model->NUMD2outputs, writeAscii, "numd2"); fclose(fpState); LOGmakeEntry(fileName, description); } diff --git a/src/spicelib/devices/numos/nummdump.c b/src/spicelib/devices/numos/nummdump.c index 3fa18e3cc..5e2fb3d60 100644 --- a/src/spicelib/devices/numos/nummdump.c +++ b/src/spicelib/devices/numos/nummdump.c @@ -38,6 +38,7 @@ NUMOSdump(GENmodel *inModel, CKTcircuit *ckt) char *prefix; int *state_num; int anyOutput = 0; + BOOLEAN writeAscii = TRUE; if (ckt->CKTmode & MODEDCOP) { prefix = "OP"; @@ -69,12 +70,15 @@ NUMOSdump(GENmodel *inModel, CKTcircuit *ckt) anyOutput = 1; sprintf(fileName, "%s%s.%d.%s", output->OUTProotFile, prefix, *state_num, inst->NUMOSname); - if ((fpState = fopen(fileName, "wb")) == NULL) { + + writeAscii = compareFiletypeVar("ascii"); + + if (!(fpState = fopen(fileName, (writeAscii ? "w" : "wb")))) { perror(fileName); } else { NUMOSputHeader(fpState, ckt, inst); TWOprnSolution(fpState, inst->NUMOSpDevice, - model->NUMOSoutputs); + model->NUMOSoutputs, writeAscii, "numos"); fclose(fpState); LOGmakeEntry(fileName, description); }