/* * Copyright (c) 2004-2008 Hypertriton, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Export of models to SPICE3 format. */ #include "core.h" #include #include #include /* Generate a SPICE3 input deck for the given circuit. */ int ES_CircuitExportSPICE3(ES_Circuit *ckt, const char *path) { ES_Component *com; unsigned int ncards = 0; FILE *f; if ((f = fopen(path, "w")) == NULL) { AG_SetError("%s: %s", path, strerror(errno)); return (-1); } fputs(OBJECT(ckt)->name, f); if (ckt->descr[0] != '\0') { fprintf(f, " (%s)", ckt->descr); } fprintf(f, "\n* Generated by Edacious %s " "\n\n", VERSION); CIRCUIT_FOREACH_COMPONENT(com, ckt) { if (COMCLASS(com)->export_model != NULL) { fprintf(f, "* %s:%s\n", OBJECT(com)->cls->name, OBJECT(com)->name); if (COMCLASS(com)->export_model(com, CIRCUIT_SPICE3, f) == -1) { goto fail; } ncards++; } else { fprintf(f, "* skipped: %s:%s\n", OBJECT(com)->cls->name, OBJECT(com)->name); } } fprintf(f, ".OP\n"); fprintf(f, ".END\n"); fclose(f); AG_TextTmsg(AG_MSG_INFO, 1250, _("`%s' was successfully exported to `%s' (%u cards)"), OBJECT(ckt)->name, path, ncards); return (0); fail: fclose(f); AG_TextMsg(AG_MSG_ERROR, "%s: %s", OBJECT(ckt)->name, AG_GetError()); return (-1); }