1 // *****************************************************************************
2 // *****************************************************************************
3 // Copyright 2012 - 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 lefiKRDEFS_h
31 #define lefiKRDEFS_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 // Added by mgwoo
38 #define LEF_COPY_CONSTRUCTOR_H(cname) cname(const cname & prev)
39 #define LEF_COPY_CONSTRUCTOR_C(cname) cname::cname(const cname & prev)
40 
41 #define LEF_ASSIGN_OPERATOR_H(cname) cname& operator=(const cname & prev)
42 #define LEF_ASSIGN_OPERATOR_C(cname) cname& cname::operator=(const cname & prev)
43 #define CHECK_SELF_ASSIGN                                               \
44 {                                                                       \
45     if (this == &prev) {                                                \
46         return *this;                                                   \
47     }                                                                   \
48 }
49 
50 #define LEF_COPY_FUNC(varname) {(varname) = prev.varname;}
51 #define LEF_MALLOC_FUNC(varname, vartype, length)                           \
52 {                                                                       \
53     if( prev.varname ) {                                                \
54         varname = (vartype*) lefMalloc(length);                         \
55         memcpy(varname, prev.varname, length);                          \
56     }                                                                   \
57 }
58 
59 #define LEF_MALLOC_FUNC_WITH_OPERATOR(varname, vartype, length)             \
60 {                                                                       \
61     if( prev.varname ) {                                                \
62         varname = (vartype*) lefMalloc(length);                         \
63         *(varname) = *(prev.varname);                                   \
64     }                                                                   \
65 }
66 
67 
68 #define LEF_MALLOC_FUNC_FOR_2D(varname, vartype, length1, length2 )     \
69 {                                                                       \
70     if(prev.varname) {                                                  \
71         varname = (vartype**) lefMalloc( sizeof(vartype*) * length1 );  \
72                                                                         \
73         for(int i=0; i<length1; i++) {                                  \
74             if( prev.varname[i] ) {                                     \
75                 varname[i] = (vartype*) lefMalloc( sizeof(vartype) * length2 );\
76                 *(varname[i]) = *(prev.varname[i]);                     \
77             }                                                           \
78             else {                                                      \
79                 varname[i] = 0;                                         \
80             }                                                           \
81         }                                                               \
82     }                                                                   \
83     else {                                                              \
84         varname = 0;                                                    \
85     }                                                                   \
86 }
87 
88 #define LEF_MALLOC_FUNC_FOR_2D_ALWAYS_MALLOC(varname, vartype, length1, length2 ) \
89 {                                                                       \
90     if(prev.varname) {                                                  \
91         varname = (vartype**) lefMalloc( sizeof(vartype*) * length1 );  \
92                                                                         \
93         for(int i=0; i<length1; i++) {                                  \
94             varname[i] = (vartype*) lefMalloc( sizeof(vartype) * length2 ); \
95             if( prev.varname[i] ) {                                     \
96                 *(varname[i]) = *(prev.varname[i]);                     \
97             }                                                           \
98         }                                                               \
99     }                                                                   \
100     else {                                                              \
101         varname = 0;                                                    \
102     }                                                                   \
103 }
104 
105 #define LEF_MALLOC_FUNC_FOR_2D_STR(varname, length )                        \
106 {                                                                       \
107     if(prev.varname) {                                                  \
108         varname = (char**) lefMalloc( sizeof(char*) * length );         \
109                                                                         \
110         for(int i=0; i<length; i++) {                                   \
111             if( prev.varname[i] ) {                                     \
112                 int len = strlen(prev.varname[i])+1;                      \
113                 varname[i] = (char*) lefMalloc( len );                  \
114                 strcpy( varname[i], prev.varname[i]);                   \
115             }                                                           \
116             else {                                                      \
117                 varname[i] = 0;                                         \
118             }                                                           \
119         }                                                               \
120     }                                                                   \
121     else {                                                              \
122         varname = 0;                                                    \
123     }                                                                   \
124 }
125 
126 #endif
127