/* File: paste.c * * This file is part of XSCHEM, * a schematic capture and Spice/Vhdl/Verilog netlisting tool for circuit * simulation. * Copyright (C) 1998-2020 Stefan Frederik Schippers * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xschem.h" void merge_text(FILE *fd) { int i; const char *strlayer; check_text_storage(); i=lasttext; textelement[i].txt_ptr=NULL; load_ascii_string(&textelement[i].txt_ptr,fd); fscanf(fd, "%lf %lf %d %d %lf %lf ", &textelement[i].x0, &textelement[i].y0, &textelement[i].rot, &textelement[i].flip, &textelement[i].xscale, &textelement[i].yscale); textelement[i].prop_ptr=NULL; textelement[i].font=NULL; textelement[i].sel=0; load_ascii_string(&textelement[i].prop_ptr,fd); my_strdup(302, &textelement[i].font, get_tok_value(textelement[i].prop_ptr, "font", 0));/*20171206 */ strlayer = get_tok_value(textelement[i].prop_ptr, "layer", 0); /*20171206 */ if(strlayer[0]) textelement[i].layer = atoi(strlayer); else textelement[i].layer = -1; select_text(i,SELECTED, 1); set_modify(1); lasttext++; } void merge_wire(FILE *fd) { int i; double x1,y1,x2,y2; char *ptr=NULL; i=lastwire; fscanf(fd, "%lf %lf %lf %lf",&x1, &y1, &x2, &y2 ); load_ascii_string( &ptr, fd); storeobject(-1, x1,y1,x2,y2,WIRE,0,SELECTED,ptr); my_free(870, &ptr); select_wire(i, SELECTED, 1); } void merge_box(FILE *fd) { int i,c; Box *ptr; fscanf(fd, "%d",&c); if(c>=cadlayers) { fprintf(errfp,"Rectangle layer > defined cadlayers, increase cadlayers\n"); c=cadlayers-1; } /* 20150408 */ check_box_storage(c); i=lastrect[c]; ptr=rect[c]; fscanf(fd, "%lf %lf %lf %lf ",&ptr[i].x1, &ptr[i].y1, &ptr[i].x2, &ptr[i].y2); ptr[i].prop_ptr=NULL; RECTORDER(ptr[i].x1, ptr[i].y1, ptr[i].x2, ptr[i].y2); /* 20180108 */ ptr[i].sel=0; load_ascii_string( &ptr[i].prop_ptr, fd); select_box(c,i, SELECTED, 1); lastrect[c]++; set_modify(1); } void merge_arc(FILE *fd) { int i,c; xArc *ptr; fscanf(fd, "%d",&c); if(c>=cadlayers) { fprintf(errfp,"arc layer > defined cadlayers, increase cadlayers\n"); c=cadlayers-1; } /* 20150408 */ check_arc_storage(c); i=lastarc[c]; ptr=arc[c]; fscanf(fd, "%lf %lf %lf %lf %lf ",&ptr[i].x, &ptr[i].y, &ptr[i].r, &ptr[i].a, &ptr[i].b); ptr[i].prop_ptr=NULL; ptr[i].sel=0; load_ascii_string(&ptr[i].prop_ptr, fd); if( !strcmp(get_tok_value(ptr[i].prop_ptr,"fill",0),"true") ) /* 20181011 */ ptr[i].fill =1; else ptr[i].fill =0; select_arc(c,i, SELECTED, 1); lastarc[c]++; set_modify(1); } void merge_polygon(FILE *fd) { int i,c, j, points; xPolygon *ptr; fscanf(fd, "%d %d",&c, &points); if(c>=cadlayers) { fprintf(errfp,"Rectangle layer > defined cadlayers, increase cadlayers\n"); c=cadlayers-1; } /* 20150408 */ check_polygon_storage(c); i=lastpolygon[c]; ptr=polygon[c]; ptr[i].x=NULL; ptr[i].y=NULL; ptr[i].selected_point=NULL; ptr[i].prop_ptr=NULL; ptr[i].x = my_calloc(303, points, sizeof(double)); ptr[i].y = my_calloc(304, points, sizeof(double)); ptr[i].selected_point= my_calloc(305, points, sizeof(unsigned short)); ptr[i].points=points; ptr[i].sel=0; for(j=0;j=cadlayers) { fprintf(errfp,"Rectangle layer > defined cadlayers, increase cadlayers\n"); c=cadlayers-1; } /* 20150408 */ check_line_storage(c); i=lastline[c]; ptr=line[c]; fscanf(fd, "%lf %lf %lf %lf ",&ptr[i].x1, &ptr[i].y1, &ptr[i].x2, &ptr[i].y2); ORDER(ptr[i].x1, ptr[i].y1, ptr[i].x2, ptr[i].y2); /* 20180108 */ ptr[i].prop_ptr=NULL; ptr[i].sel=0; load_ascii_string( &ptr[i].prop_ptr, fd); select_line(c,i, SELECTED, 1); lastline[c]++; set_modify(1); } void merge_inst(int k,FILE *fd) { int i; char *prop_ptr=NULL; Instance *ptr; i=lastinst; check_inst_storage(); ptr=inst_ptr; ptr[i].name=NULL; load_ascii_string(&ptr[i].name,fd); if(fscanf(fd, "%lf %lf %d %d",&ptr[i].x0, &ptr[i].y0,&ptr[i].rot, &ptr[i].flip) < 4) { fprintf(errfp,"WARNING: missing fields for INSTANCE object, ignoring.\n"); read_line(fd, 0); return; } ptr[i].sel=0; ptr[i].flags=0; ptr[i].ptr=-1; ptr[i].prop_ptr=NULL; ptr[i].instname=NULL; /* 20150411 */ ptr[i].node=NULL; load_ascii_string(&prop_ptr,fd); if(!k) hash_all_names(i); new_prop_string(i, prop_ptr, k, disable_unique_names); /* the final tmp argument is zero for the 1st call and used in */ /* new_prop_string() for cleaning some internal caches. */ my_strdup2(306, &inst_ptr[i].instname, get_tok_value(inst_ptr[i].prop_ptr, "name", 0)); /* 20150409 */ my_free(871, &prop_ptr); lastinst++; set_modify(1); prepared_hash_instances=0; prepared_netlist_structs=0; prepared_hilight_structs=0; } void match_merged_inst(int old) { int i,missing,symbol; int cond; char *type; missing = 0; for(i=old;i