1 // ***************************************************************************** 2 // ***************************************************************************** 3 // Copyright 2013, Cadence Design Systems 4 // 5 // This file is part of the Cadence LEF/DEF Open Source 6 // Distribution, Product Version 5.8. 7 // 8 // Licensed under the Apache License, Version 2.0 (the "License"); 9 // you may not use this file except in compliance with the License. 10 // You may obtain a copy of the License at 11 // 12 // http://www.apache.org/licenses/LICENSE-2.0 13 // 14 // Unless required by applicable law or agreed to in writing, software 15 // distributed under the License is distributed on an "AS IS" BASIS, 16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 17 // implied. See the License for the specific language governing 18 // permissions and limitations under the License. 19 // 20 // For updates, support, or to become part of the LEF/DEF Community, 21 // check www.openeda.org for details. 22 // 23 // $Author: dell $ 24 // $Revision: #1 $ 25 // $Date: 2017/06/06 $ 26 // $State: $ 27 // ***************************************************************************** 28 // ***************************************************************************** 29 30 #ifndef defiKRDEFS_h 31 #define defiKRDEFS_h 32 33 #define BEGIN_LEFDEF_PARSER_NAMESPACE namespace LefDefParser { 34 #define END_LEFDEF_PARSER_NAMESPACE } 35 #define USE_LEFDEF_PARSER_NAMESPACE using namespace LefDefParser; 36 37 // 38 // Below is to implement COPY_CONSTRUCTOR / ASSIGN_OPERATOR 39 // 40 // Author : mgwoo 41 // Date : 2017/01/31 42 // Mail : mgwoo@unist.ac.kr 43 // 44 45 #include <stdlib.h> 46 #include <string.h> 47 #define DEF_COPY_CONSTRUCTOR_H(cname) cname(const cname & prev) 48 #define DEF_COPY_CONSTRUCTOR_C(cname) cname::cname(const cname & prev) 49 50 #define DEF_ASSIGN_OPERATOR_H(cname) cname& operator=(const cname & prev) 51 #define DEF_ASSIGN_OPERATOR_C(cname) cname& cname::operator=(const cname & prev) 52 #define CHECK_SELF_ASSIGN \ 53 { \ 54 if (this == &prev) { \ 55 return *this; \ 56 } \ 57 } 58 59 #define DEF_COPY_FUNC(varname) {(varname) = prev.varname;} 60 #define DEF_MALLOC_FUNC(varname, vartype, length) \ 61 { \ 62 if( prev.varname ) { \ 63 varname = (vartype*) malloc(length); \ 64 memcpy(varname, prev.varname, length); \ 65 } \ 66 } 67 68 #define DEF_MALLOC_FUNC_WITH_OPERATOR(varname, vartype, length) \ 69 { \ 70 if( prev.varname ) { \ 71 varname = (vartype*) malloc(length); \ 72 *(varname) = *(prev.varname); \ 73 } \ 74 } 75 76 77 // MALLOC/FREE version 78 #define DEF_MALLOC_FUNC_FOR_2D(varname, vartype, length1, length2 ) \ 79 { \ 80 if(prev.varname) { \ 81 varname = (vartype**) malloc( sizeof(vartype*) * length1 ); \ 82 \ 83 for(int i=0; i<length1; i++) { \ 84 if( prev.varname[i] ) { \ 85 int len = sizeof(vartype) * length2; \ 86 varname[i] = (vartype*) malloc( len ); \ 87 *(varname[i]) = *(prev.varname[i]); \ 88 } \ 89 else { \ 90 varname[i] = 0; \ 91 } \ 92 } \ 93 } \ 94 else { \ 95 varname = 0; \ 96 } \ 97 } 98 99 // MALLOC/DELETE version 100 #define DEF_MALLOC_FUNC_FOR_2D_MALLOC_NEW(varname, vartype, length1, length2 ) \ 101 { \ 102 if(prev.varname) { \ 103 varname = (vartype**)malloc( sizeof(vartype*)* length1 ); \ 104 \ 105 for(int i=0; i<length1; i++) { \ 106 if( prev.varname[i] ) { \ 107 varname[i] = new vartype(defData); \ 108 *(varname[i]) = *(prev.varname[i]); \ 109 } \ 110 else { \ 111 varname[i] = 0; \ 112 } \ 113 } \ 114 } \ 115 else { \ 116 varname = 0; \ 117 } \ 118 } 119 120 #define DEF_MALLOC_FUNC_FOR_2D_POINT( varname, length ) \ 121 { \ 122 if(prev.varname) { \ 123 varname = (defiPoints**) malloc( sizeof(defiPoints*) * length );\ 124 \ 125 for(int i=0; i<length; i++) { \ 126 if( prev.varname[i] ) { \ 127 varname[i] = (defiPoints*) malloc( sizeof(defiPoints) );\ 128 varname[i]->numPoints = prev.varname[i]->numPoints; \ 129 varname[i]->x = (int*) malloc( sizeof(int) ); \ 130 *(varname[i]->x) = *(prev.varname[i]->x); \ 131 varname[i]->y = (int*) malloc( sizeof(int) ); \ 132 *(varname[i]->y) = *(prev.varname[i]->y); \ 133 } \ 134 else { \ 135 varname[i] = 0; \ 136 } \ 137 } \ 138 } \ 139 else { \ 140 varname = 0; \ 141 } \ 142 } 143 144 145 #define DEF_MALLOC_FUNC_FOR_2D_STR(varname, length ) \ 146 { \ 147 if(prev.varname) { \ 148 varname = (char**) malloc( sizeof(char*) * length ); \ 149 \ 150 for(int i=0; i<length; i++) { \ 151 if( prev.varname[i] ) { \ 152 int len = strlen(prev.varname[i])+1; \ 153 varname[i] = (char*) malloc( len ); \ 154 strcpy( varname[i], prev.varname[i]); \ 155 } \ 156 else { \ 157 varname[i] = 0; \ 158 } \ 159 } \ 160 } \ 161 else { \ 162 varname = 0; \ 163 } \ 164 } 165 166 #endif /* defiKRDEFS_h */ 167