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