KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_kibis.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.TXT for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
25
26#include <sim/kibis/kibis.h>
27
28namespace
29{
30std::string GetLibraryPath( const std::string& aBaseName )
31{
32 wxFileName fn( KI_TEST::GetEeschemaTestDataDir() );
33 fn.SetName( aBaseName );
34 fn.SetExt( "ibs" );
35 return std::string( fn.GetFullPath().ToUTF8() );
36}
37} // namespace
38
39
41
42
44{
45 KIBIS kibis;
46
47 BOOST_TEST( !kibis.m_valid );
48
49 // IBIS_BASE interface
50 // If this isn't null, it's uninited and access will crash
51 BOOST_REQUIRE( !kibis.m_Reporter );
52
53 // Doesn't crash (also doesn't do anything)
54 kibis.Report( "Dummy", RPT_SEVERITY_INFO );
55}
56
57
59{
60 WX_STRING_REPORTER reporter;
61
62 std::string path = GetLibraryPath( "ibis_v1_1" );
63 KIBIS top( path, &reporter );
64
65 BOOST_TEST_INFO( "Parsed: " << path );
66 BOOST_TEST_INFO( "Reported: " << reporter.GetMessages() );
67
68 BOOST_TEST( top.m_valid );
69
70 KIBIS_MODEL* model = top.GetModel( "Input" );
71
72 BOOST_REQUIRE( model != nullptr );
73 BOOST_TEST_INFO( "Model: " << model->m_name );
74
75 BOOST_TEST( model->m_name == "Input" );
76 BOOST_TEST( (int) model->m_type == (int) IBIS_MODEL_TYPE::INPUT_STD );
77 BOOST_TEST( (int) model->m_polarity == (int) IBIS_MODEL_POLARITY::NON_INVERTING );
78 BOOST_TEST( (int) model->m_enable = (int) IBIS_MODEL_ENABLE::ACTIVE_HIGH );
79
80 BOOST_TEST( model->HasGNDClamp() );
81
82 KIBIS_COMPONENT* comp = top.GetComponent( "Virtual" );
83
84 BOOST_REQUIRE( comp != nullptr );
85
86 BOOST_TEST_INFO( "Component: " << comp->m_name );
87
88 BOOST_TEST( comp->m_name == "Virtual" );
89 BOOST_TEST( comp->m_pins.size() == 4 );
90}
91
92BOOST_AUTO_TEST_CASE( Load_v5_1, * boost::unit_test::tolerance( 1e-15 ) )
93{
94 WX_STRING_REPORTER reporter;
95
96 std::string path = GetLibraryPath( "ibis_v5_1" );
97 KIBIS top( path, &reporter );
98
99 BOOST_TEST_INFO( "Parsed: " << path );
100 BOOST_TEST_INFO( "Reported: " << reporter.GetMessages() );
101
102 BOOST_TEST( top.m_valid );
103
104 KIBIS_COMPONENT* comp = top.GetComponent( "Virtual" );
105
106 BOOST_REQUIRE( comp != nullptr );
107 BOOST_TEST_INFO( "Component: " << comp->m_name );
108
109 BOOST_TEST( comp->m_name == "Virtual" );
110 BOOST_TEST( comp->m_manufacturer == "KiCad" );
111 BOOST_TEST( comp->m_pins.size() == 4 );
112
114
115 pin = comp->GetPin( "A1" );
116
117 BOOST_REQUIRE( pin != nullptr );
118
119 BOOST_TEST( pin->m_signalName == "VSS" );
120 BOOST_TEST( pin->m_pinNumber == "A1" );
121 BOOST_TEST( pin->m_Rpin.value[0] == 0.246 );
122 BOOST_TEST( pin->m_Rpin.value[1] == 0.165 );
123 BOOST_TEST( pin->m_Rpin.value[2] == 0.377 );
124 BOOST_TEST( pin->m_Lpin.value[0] == 1.49e-9 );
125 BOOST_TEST( pin->m_Lpin.value[1] == 0.98e-9 );
126 BOOST_TEST( pin->m_Lpin.value[2] == 2.23e-9 );
127 BOOST_TEST( pin->m_Cpin.value[0] == 0.40e-12 );
128 BOOST_TEST( pin->m_Cpin.value[1] == 0.29e-12 );
129 BOOST_TEST( pin->m_Cpin.value[2] == 0.56e-12 );
130 BOOST_TEST( pin->m_models.size() == 0 );
131
132 pin = comp->GetPin( "A2" );
133
134 BOOST_REQUIRE( pin != nullptr );
135
136 BOOST_TEST( pin->m_signalName == "VDD" );
137 BOOST_TEST( pin->m_pinNumber == "A2" );
138 BOOST_TEST( pin->m_Rpin.value[0] == 0.246 );
139 BOOST_TEST( pin->m_Rpin.value[1] == 0.165 );
140 BOOST_TEST( pin->m_Rpin.value[2] == 0.377 );
141 BOOST_TEST( pin->m_Lpin.value[0] == 1.49e-9 );
142 BOOST_TEST( pin->m_Lpin.value[1] == 0.98e-9 );
143 BOOST_TEST( pin->m_Lpin.value[2] == 2.23e-9 );
144 BOOST_TEST( pin->m_Cpin.value[0] == 0.40e-12 );
145 BOOST_TEST( pin->m_Cpin.value[1] == 0.29e-12 );
146 BOOST_TEST( pin->m_Cpin.value[2] == 0.56e-12 );
147 BOOST_TEST( pin->m_models.size() == 0 );
148
149 pin = comp->GetPin( "B1" );
150
151 BOOST_REQUIRE( pin != nullptr );
152
153 BOOST_TEST( pin->m_signalName == "A0" );
154 BOOST_TEST( pin->m_pinNumber == "B1" );
155 BOOST_TEST( pin->m_Rpin.value[0] == 0.225 );
156 BOOST_TEST( pin->m_Rpin.value[1] == 0.225 );
157 BOOST_TEST( pin->m_Rpin.value[2] == 0.225 );
158 BOOST_TEST( pin->m_Lpin.value[0] == 1.18e-9 );
159 BOOST_TEST( pin->m_Lpin.value[1] == 1.18e-9 );
160 BOOST_TEST( pin->m_Lpin.value[2] == 1.18e-9 );
161 BOOST_TEST( pin->m_Cpin.value[0] == 0.39e-12 );
162 BOOST_TEST( pin->m_Cpin.value[1] == 0.39e-12 );
163 BOOST_TEST( pin->m_Cpin.value[2] == 0.39e-12 );
164 BOOST_TEST( pin->m_models.size() == 1 );
165 BOOST_TEST( pin->m_models[0]->m_name == "AC40" );
166
167 pin = comp->GetPin( "B2" );
168
169 BOOST_REQUIRE( pin != nullptr );
170
171 BOOST_TEST( pin->m_signalName == "DQ0" );
172 BOOST_TEST( pin->m_pinNumber == "B2" );
173 BOOST_TEST( pin->m_Rpin.value[0] == 0.214 );
174 BOOST_TEST( pin->m_Rpin.value[1] == 0.214 );
175 BOOST_TEST( pin->m_Rpin.value[2] == 0.214 );
176 BOOST_TEST( pin->m_Lpin.value[0] == 1.05e-9 );
177 BOOST_TEST( pin->m_Lpin.value[1] == 1.05e-9 );
178 BOOST_TEST( pin->m_Lpin.value[2] == 1.05e-9 );
179 BOOST_TEST( pin->m_Cpin.value[0] == 0.39e-12 );
180 BOOST_TEST( pin->m_Cpin.value[1] == 0.39e-12 );
181 BOOST_TEST( pin->m_Cpin.value[2] == 0.39e-12 );
182 BOOST_TEST( pin->m_models.size() == 2 );
183 BOOST_TEST( pin->m_models[0]->m_name == "DQ40" );
184 BOOST_TEST( pin->m_models[1]->m_name == "DQ40_ODT40" );
185
187
188 model = top.GetModel( "AC40" );
189
190 BOOST_REQUIRE( model != nullptr );
191 BOOST_TEST_INFO( "Model: " << model->m_name );
192
193 BOOST_TEST( model->m_name == "AC40" );
194 BOOST_TEST( (int) model->m_type == (int) IBIS_MODEL_TYPE::OUTPUT );
195 BOOST_TEST( (int) model->m_polarity == (int) IBIS_MODEL_POLARITY::NON_INVERTING );
196 BOOST_TEST( (int) model->m_enable = (int) IBIS_MODEL_ENABLE::ACTIVE_HIGH );
197 BOOST_TEST( model->m_vmeas == 0.675 );
198 BOOST_TEST( model->m_cref == 5e-12 );
199 BOOST_TEST( model->m_rref == 50.0 );
200 BOOST_TEST( model->m_vref == 0.675 );
201 BOOST_TEST( model->m_C_comp.value[0] == 2.68e-12 );
202 BOOST_TEST( model->m_C_comp.value[1] == 2.64e-12 );
203 BOOST_TEST( model->m_C_comp.value[2] == 2.75e-12 );
204 BOOST_TEST( model->m_voltageRange.value[0] == 1.35 );
205 BOOST_TEST( model->m_voltageRange.value[1] == 1.28 );
206 BOOST_TEST( model->m_voltageRange.value[2] == 1.42 );
207 BOOST_TEST( model->m_temperatureRange.value[0] == 50.0 );
208 BOOST_TEST( model->m_temperatureRange.value[1] == 100.0 );
209 BOOST_TEST( model->m_temperatureRange.value[2] == 0.0 );
210
211 BOOST_TEST( model->HasGNDClamp() );
212 BOOST_TEST( model->m_GNDClamp.m_entries.size() == 4 );
213 BOOST_TEST( model->m_GNDClamp.m_entries[0].V == -1.35 );
214 BOOST_TEST( model->m_GNDClamp.m_entries[0].I.value[0] == -26.89e-3 );
215 BOOST_TEST( model->m_GNDClamp.m_entries[0].I.value[1] == -20.44e-3 );
216 BOOST_TEST( model->m_GNDClamp.m_entries[0].I.value[2] == -35.94e-3 );
217 BOOST_TEST( model->m_GNDClamp.m_entries[1].V == 0.0 );
218 BOOST_TEST( model->m_GNDClamp.m_entries[1].I.value[0] == -29.09e-9 );
219 BOOST_TEST( model->m_GNDClamp.m_entries[1].I.value[1] == -44.53e-9 );
220 BOOST_TEST( model->m_GNDClamp.m_entries[1].I.value[2] == -51.87e-9 );
221 BOOST_TEST( model->m_GNDClamp.m_entries[2].V == 1.35 );
222 BOOST_TEST( model->m_GNDClamp.m_entries[2].I.value[0] == 0.518e-6 );
223 BOOST_TEST( model->m_GNDClamp.m_entries[2].I.value[1] == 0.0 );
224 BOOST_TEST( model->m_GNDClamp.m_entries[2].I.value[2] == 0.444e-6 );
225 BOOST_TEST( model->m_GNDClamp.m_entries[3].V == 2.7 );
226 BOOST_TEST( model->m_GNDClamp.m_entries[3].I.value[0] == 0.0 );
227 BOOST_TEST( model->m_GNDClamp.m_entries[3].I.value[1] == 0.0 );
228 BOOST_TEST( model->m_GNDClamp.m_entries[3].I.value[2] == 0.0 );
229
230 BOOST_TEST( model->HasPOWERClamp() );
231 BOOST_TEST( model->m_POWERClamp.m_entries.size() == 4 );
232 BOOST_TEST( model->m_POWERClamp.m_entries[0].V == -1.35 );
233 BOOST_TEST( model->m_POWERClamp.m_entries[0].I.value[0] == 55.06e-3 );
234 BOOST_TEST( model->m_POWERClamp.m_entries[0].I.value[1] == 46.76e-3 );
235 BOOST_TEST( model->m_POWERClamp.m_entries[0].I.value[2] == 74.09e-3 );
236 BOOST_TEST( model->m_POWERClamp.m_entries[1].V == 0.0 );
237 BOOST_TEST( model->m_POWERClamp.m_entries[1].I.value[0] == 0.0 );
238 BOOST_TEST( model->m_POWERClamp.m_entries[1].I.value[1] == 0.515e-6 );
239 BOOST_TEST( model->m_POWERClamp.m_entries[1].I.value[2] == 74.94e-9 );
240 BOOST_TEST( model->m_POWERClamp.m_entries[2].V == 1.35 );
241 BOOST_TEST( model->m_POWERClamp.m_entries[2].I.value[0] == 0.0 );
242 BOOST_TEST( model->m_POWERClamp.m_entries[2].I.value[1] == 0.0 );
243 BOOST_TEST( model->m_POWERClamp.m_entries[2].I.value[2] == 0.0 );
244 BOOST_TEST( model->m_POWERClamp.m_entries[3].V == 2.7 );
245 BOOST_TEST( model->m_POWERClamp.m_entries[3].I.value[0] == 0.0 );
246 BOOST_TEST( model->m_POWERClamp.m_entries[3].I.value[1] == 0.0 );
247 BOOST_TEST( model->m_POWERClamp.m_entries[3].I.value[2] == 0.0 );
248
249 BOOST_TEST( model->HasPullup() );
250 BOOST_TEST( model->m_pullup.m_entries.size() == 4 );
251 BOOST_TEST( model->m_pullup.m_entries[0].V == -1.35 );
252 BOOST_TEST( model->m_pullup.m_entries[0].I.value[0] == 18.04e-3 );
253 BOOST_TEST( model->m_pullup.m_entries[0].I.value[1] == 16.15e-3 );
254 BOOST_TEST( model->m_pullup.m_entries[0].I.value[2] == 17.46e-3 );
255 BOOST_TEST( model->m_pullup.m_entries[1].V == 0.0 );
256 BOOST_TEST( model->m_pullup.m_entries[1].I.value[0] == 3.412e-9 );
257 BOOST_TEST( model->m_pullup.m_entries[1].I.value[1] == 0.527e-6 );
258 BOOST_TEST( model->m_pullup.m_entries[1].I.value[2] == 0.327e-6 );
259 BOOST_TEST( model->m_pullup.m_entries[2].V == 1.35 );
260 BOOST_TEST( model->m_pullup.m_entries[2].I.value[0] == -26.46e-3 );
261 BOOST_TEST( model->m_pullup.m_entries[2].I.value[1] == -24.75e-3 );
262 BOOST_TEST( model->m_pullup.m_entries[2].I.value[2] == -22.82e-3 );
263 BOOST_TEST( model->m_pullup.m_entries[3].V == 2.7 );
264 BOOST_TEST( model->m_pullup.m_entries[3].I.value[0] == -31.03e-3 );
265 BOOST_TEST( model->m_pullup.m_entries[3].I.value[1] == -28.82e-3 );
266 BOOST_TEST( model->m_pullup.m_entries[3].I.value[2] == -27.31e-3 );
267
268 BOOST_TEST( model->HasPulldown() );
269 BOOST_TEST( model->m_pulldown.m_entries.size() == 4 );
270 BOOST_TEST( model->m_pulldown.m_entries[0].V == -1.35 );
271 BOOST_TEST( model->m_pulldown.m_entries[0].I.value[0] == -23.01e-3 );
272 BOOST_TEST( model->m_pulldown.m_entries[0].I.value[1] == -20.02e-3 );
273 BOOST_TEST( model->m_pulldown.m_entries[0].I.value[2] == -20.46e-3 );
274 BOOST_TEST( model->m_pulldown.m_entries[1].V == 0.0 );
275 BOOST_TEST( model->m_pulldown.m_entries[1].I.value[0] == -38.81e-9 );
276 BOOST_TEST( model->m_pulldown.m_entries[1].I.value[1] == -32.33e-9 );
277 BOOST_TEST( model->m_pulldown.m_entries[1].I.value[2] == -49.77e-9 );
278 BOOST_TEST( model->m_pulldown.m_entries[2].V == 1.35 );
279 BOOST_TEST( model->m_pulldown.m_entries[2].I.value[0] == 26.98e-3 );
280 BOOST_TEST( model->m_pulldown.m_entries[2].I.value[1] == 23.63e-3 );
281 BOOST_TEST( model->m_pulldown.m_entries[2].I.value[2] == 26.60e-3 );
282 BOOST_TEST( model->m_pulldown.m_entries[3].V == 2.7 );
283 BOOST_TEST( model->m_pulldown.m_entries[3].I.value[0] == 29.20e-3 );
284 BOOST_TEST( model->m_pulldown.m_entries[3].I.value[1] == 25.40e-3 );
285 BOOST_TEST( model->m_pulldown.m_entries[3].I.value[2] == 29.03e-3 );
286
287 BOOST_TEST( model->m_ramp.m_Rload == 50.0 );
288 BOOST_TEST( model->m_ramp.m_rising.value[0].m_dv == 0.462 );
289 BOOST_TEST( model->m_ramp.m_rising.value[0].m_dt == 0.131e-9 );
290 BOOST_TEST( model->m_ramp.m_rising.value[1].m_dv == 0.439 );
291 BOOST_TEST( model->m_ramp.m_rising.value[1].m_dt == 0.138e-9 );
292 BOOST_TEST( model->m_ramp.m_rising.value[2].m_dv == 0.462 );
293 BOOST_TEST( model->m_ramp.m_rising.value[2].m_dt == 0.158e-9 );
294 BOOST_TEST( model->m_ramp.m_falling.value[0].m_dv == 0.465 );
295 BOOST_TEST( model->m_ramp.m_falling.value[0].m_dt == 0.116e-9 );
296 BOOST_TEST( model->m_ramp.m_falling.value[1].m_dv == 0.438 );
297 BOOST_TEST( model->m_ramp.m_falling.value[1].m_dt == 0.126e-9 );
298 BOOST_TEST( model->m_ramp.m_falling.value[2].m_dv == 0.468 );
299 BOOST_TEST( model->m_ramp.m_falling.value[2].m_dt == 0.117e-9 );
300
301 BOOST_TEST( model->m_risingWaveforms.size() == 2 );
302 BOOST_TEST( (int) model->m_risingWaveforms[1]->m_type == (int) IBIS_WAVEFORM_TYPE::RISING );
303 BOOST_TEST( model->m_risingWaveforms[1]->m_R_fixture == 50.0 );
304 BOOST_TEST( model->m_risingWaveforms[1]->m_V_fixture == 1.35 );
305 BOOST_TEST( model->m_risingWaveforms[1]->m_V_fixture_min == 1.28 );
306 BOOST_TEST( model->m_risingWaveforms[1]->m_V_fixture_max == 1.42 );
307 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries.size() == 5 );
308 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[0].t == 0 );
309 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[0].V.value[0] == 0.573 );
310 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[0].V.value[1] == 0.550 );
311 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[0].V.value[2] == 0.636 );
312 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[1].t == 1.001e-9 );
313 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[1].V.value[0] == 0.574 );
314 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[1].V.value[1] == 0.551 );
315 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[1].V.value[2] == 0.906 );
316 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[2].t == 2e-9 );
317 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[2].V.value[0] == 1.348 );
318 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[2].V.value[1] == 1.269 );
319 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[2].V.value[2] == 1.416 );
320 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[3].t == 2.491e-9 );
321 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[3].V.value[0] == 1.349 );
322 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[3].V.value[1] == 1.280 );
323 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[3].V.value[2] == 1.416 );
324 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[4].t == 10e-9 );
325 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[4].V.value[0] == 1.349 );
326 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[4].V.value[1] == 1.282 );
327 BOOST_TEST( model->m_risingWaveforms[1]->m_table.m_entries[4].V.value[2] == 1.417 );
328
329 BOOST_TEST( model->m_fallingWaveforms.size() == 2 );
330 BOOST_TEST( (int) model->m_fallingWaveforms[1]->m_type == (int) IBIS_WAVEFORM_TYPE::FALLING );
331 BOOST_TEST( model->m_fallingWaveforms[1]->m_R_fixture == 50.0 );
332 BOOST_TEST( model->m_fallingWaveforms[1]->m_V_fixture == 1.35 );
333 BOOST_TEST( model->m_fallingWaveforms[1]->m_V_fixture_min == 1.28 );
334 BOOST_TEST( model->m_fallingWaveforms[1]->m_V_fixture_max == 1.42 );
335 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries.size() == 5 );
336 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[0].t == 0 );
337 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[0].V.value[0] == 1.349 );
338 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[0].V.value[1] == 1.282 );
339 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[0].V.value[2] == 1.417 );
340 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[1].t == 1.02e-9 );
341 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[1].V.value[0] == 1.350 );
342 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[1].V.value[1] == 1.283 );
343 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[1].V.value[2] == 1.382 );
344 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[2].t == 1.988e-9 );
345 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[2].V.value[0] == 0.576 );
346 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[2].V.value[1] == 0.606 );
347 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[2].V.value[2] == 0.638 );
348 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[3].t == 2.51e-9 );
349 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[3].V.value[0] == 0.574 );
350 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[3].V.value[1] == 0.552 );
351 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[3].V.value[2] == 0.637 );
352 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[4].t == 10e-9 );
353 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[4].V.value[0] == 0.573 );
354 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[4].V.value[1] == 0.550 );
355 BOOST_TEST( model->m_fallingWaveforms[1]->m_table.m_entries[4].V.value[2] == 0.636 );
356
357 BOOST_TEST( model->m_submodels.size() == 0 );
358
359 model = top.GetModel( "DQ40_ODT40" );
360
361 BOOST_REQUIRE( model != nullptr );
362 BOOST_TEST_INFO( "Model: " << model->m_name );
363
364 BOOST_TEST( model->m_name == "DQ40_ODT40" );
365 BOOST_TEST( (int) model->m_type == (int) IBIS_MODEL_TYPE::IO );
366 BOOST_TEST( model->m_vinl == 0.515 );
367 BOOST_TEST( model->m_vinh == 0.835 );
368 BOOST_TEST( model->m_vmeas == 0.675 );
369 BOOST_TEST( model->m_cref == 0.0 );
370 BOOST_TEST( model->m_rref == 25.0 );
371 BOOST_TEST( model->m_vref == 0.675 );
372 BOOST_TEST( model->m_C_comp.value[0] == 1.36e-12 );
373 BOOST_TEST( model->m_C_comp.value[1] == 1.26e-12 );
374 BOOST_TEST( model->m_C_comp.value[2] == 1.46e-12 );
375 BOOST_TEST( model->m_voltageRange.value[0] == 1.35 );
376 BOOST_TEST( model->m_voltageRange.value[1] == 1.28 );
377 BOOST_TEST( model->m_voltageRange.value[2] == 1.42 );
378 BOOST_TEST( model->m_temperatureRange.value[0] == 50.0 );
379 BOOST_TEST( model->m_temperatureRange.value[1] == 100.0 );
380 BOOST_TEST( model->m_temperatureRange.value[2] == 0.0 );
381
382 BOOST_TEST( model->HasGNDClamp() );
383 BOOST_TEST( model->m_GNDClamp.m_entries.size() == 4 );
384 BOOST_TEST( model->m_GNDClamp.m_entries[0].V == -1.35 );
385 BOOST_TEST( model->m_GNDClamp.m_entries[0].I.value[0] == -39.74e-3 );
386 BOOST_TEST( model->m_GNDClamp.m_entries[0].I.value[1] == -37.76e-3 );
387 BOOST_TEST( model->m_GNDClamp.m_entries[0].I.value[2] == -41.37e-3 );
388 BOOST_TEST( model->m_GNDClamp.m_entries[1].V == -0.175 );
389 BOOST_TEST( std::isnan( model->m_GNDClamp.m_entries[1].I.value[0] ) );
390 BOOST_TEST( std::isnan( model->m_GNDClamp.m_entries[1].I.value[1] ) );
391 BOOST_TEST( model->m_GNDClamp.m_entries[1].I.value[2] == 0.0 );
392 BOOST_TEST( model->m_GNDClamp.m_entries[2].V == 1.35 );
393 BOOST_TEST( model->m_GNDClamp.m_entries[2].I.value[0] == 0.0 );
394 BOOST_TEST( model->m_GNDClamp.m_entries[2].I.value[1] == 0.0 );
395 BOOST_TEST( model->m_GNDClamp.m_entries[2].I.value[2] == 0.0 );
396 BOOST_TEST( model->m_GNDClamp.m_entries[3].V == 2.7 );
397 BOOST_TEST( model->m_GNDClamp.m_entries[3].I.value[0] == 0.0 );
398 BOOST_TEST( model->m_GNDClamp.m_entries[3].I.value[1] == 0.0 );
399 BOOST_TEST( model->m_GNDClamp.m_entries[3].I.value[2] == 0.0 );
400
401 BOOST_TEST( model->HasPOWERClamp() );
402 BOOST_TEST( model->m_POWERClamp.m_entries.size() == 4 );
403 BOOST_TEST( model->m_POWERClamp.m_entries[0].V == -1.35 );
404 BOOST_TEST( model->m_POWERClamp.m_entries[0].I.value[0] == 88.45e-3 );
405 BOOST_TEST( model->m_POWERClamp.m_entries[0].I.value[1] == 79.46e-3 );
406 BOOST_TEST( model->m_POWERClamp.m_entries[0].I.value[2] == 95.25e-3 );
407 BOOST_TEST( model->m_POWERClamp.m_entries[1].V == -0.28 );
408 BOOST_TEST( std::isnan( model->m_POWERClamp.m_entries[1].I.value[0] ) );
409 BOOST_TEST( model->m_POWERClamp.m_entries[1].I.value[1] == 0.0 );
410 BOOST_TEST( std::isnan( model->m_POWERClamp.m_entries[1].I.value[2] ) );
411 BOOST_TEST( model->m_POWERClamp.m_entries[2].V == 1.35 );
412 BOOST_TEST( model->m_POWERClamp.m_entries[2].I.value[0] == 0.0 );
413 BOOST_TEST( model->m_POWERClamp.m_entries[2].I.value[1] == 0.0 );
414 BOOST_TEST( model->m_POWERClamp.m_entries[2].I.value[2] == 0.0 );
415 BOOST_TEST( model->m_POWERClamp.m_entries[3].V == 2.7 );
416 BOOST_TEST( model->m_POWERClamp.m_entries[3].I.value[0] == 0.0 );
417 BOOST_TEST( model->m_POWERClamp.m_entries[3].I.value[1] == 0.0 );
418 BOOST_TEST( model->m_POWERClamp.m_entries[3].I.value[2] == 0.0 );
419
420 BOOST_TEST( model->HasPullup() );
421 BOOST_TEST( model->m_pullup.m_entries.size() == 4 );
422 BOOST_TEST( model->m_pullup.m_entries[0].V == -1.35 );
423 BOOST_TEST( model->m_pullup.m_entries[0].I.value[0] == 7.027e-3 );
424 BOOST_TEST( model->m_pullup.m_entries[0].I.value[1] == 7.411e-3 );
425 BOOST_TEST( model->m_pullup.m_entries[0].I.value[2] == 8.620e-3 );
426 BOOST_TEST( model->m_pullup.m_entries[1].V == 0.0 );
427 BOOST_TEST( model->m_pullup.m_entries[1].I.value[0] == 31.17e-6 );
428 BOOST_TEST( model->m_pullup.m_entries[1].I.value[1] == 35.34e-6 );
429 BOOST_TEST( model->m_pullup.m_entries[1].I.value[2] == 10.66e-6 );
430 BOOST_TEST( model->m_pullup.m_entries[2].V == 1.35 );
431 BOOST_TEST( model->m_pullup.m_entries[2].I.value[0] == -21.21e-3 );
432 BOOST_TEST( model->m_pullup.m_entries[2].I.value[1] == -19.19e-3 );
433 BOOST_TEST( model->m_pullup.m_entries[2].I.value[2] == -25.02e-3 );
434 BOOST_TEST( model->m_pullup.m_entries[3].V == 2.7 );
435 BOOST_TEST( model->m_pullup.m_entries[3].I.value[0] == -25.77e-3 );
436 BOOST_TEST( model->m_pullup.m_entries[3].I.value[1] == -23.32e-3 );
437 BOOST_TEST( model->m_pullup.m_entries[3].I.value[2] == -30.53e-3 );
438
439 BOOST_TEST( model->HasPulldown() );
440 BOOST_TEST( model->m_pulldown.m_entries.size() == 4 );
441 BOOST_TEST( model->m_pulldown.m_entries[0].V == -1.35 );
442 BOOST_TEST( model->m_pulldown.m_entries[0].I.value[0] == -13.96e-3 );
443 BOOST_TEST( model->m_pulldown.m_entries[0].I.value[1] == -12.59e-3 );
444 BOOST_TEST( model->m_pulldown.m_entries[0].I.value[2] == -15.56e-3 );
445 BOOST_TEST( model->m_pulldown.m_entries[1].V == 0.0 );
446 BOOST_TEST( model->m_pulldown.m_entries[1].I.value[0] == -3.893e-6 );
447 BOOST_TEST( model->m_pulldown.m_entries[1].I.value[1] == -4.109e-6 );
448 BOOST_TEST( model->m_pulldown.m_entries[1].I.value[2] == -1.483e-6 );
449 BOOST_TEST( model->m_pulldown.m_entries[2].V == 1.35 );
450 BOOST_TEST( model->m_pulldown.m_entries[2].I.value[0] == 26.08e-3 );
451 BOOST_TEST( model->m_pulldown.m_entries[2].I.value[1] == 22.37e-3 );
452 BOOST_TEST( model->m_pulldown.m_entries[2].I.value[2] == 30.44e-3 );
453 BOOST_TEST( model->m_pulldown.m_entries[3].V == 2.7 );
454 BOOST_TEST( model->m_pulldown.m_entries[3].I.value[0] == 30.20e-3 );
455 BOOST_TEST( model->m_pulldown.m_entries[3].I.value[1] == 25.46e-3 );
456 BOOST_TEST( model->m_pulldown.m_entries[3].I.value[2] == 36.99e-3 );
457
458 BOOST_TEST( model->m_ramp.m_Rload == 50.0 );
459 BOOST_TEST( model->m_ramp.m_rising.value[0].m_dv == 0.451 );
460 BOOST_TEST( model->m_ramp.m_rising.value[0].m_dt == 134e-12 );
461 BOOST_TEST( model->m_ramp.m_rising.value[1].m_dv == 0.424 );
462 BOOST_TEST( model->m_ramp.m_rising.value[1].m_dt == 184e-12 );
463 BOOST_TEST( model->m_ramp.m_rising.value[2].m_dv == 0.495 );
464 BOOST_TEST( model->m_ramp.m_rising.value[2].m_dt == 103e-12 );
465 BOOST_TEST( model->m_ramp.m_falling.value[0].m_dv == 0.438 );
466 BOOST_TEST( model->m_ramp.m_falling.value[0].m_dt == 120e-12 );
467 BOOST_TEST( model->m_ramp.m_falling.value[1].m_dv == 0.411 );
468 BOOST_TEST( model->m_ramp.m_falling.value[1].m_dt == 159e-12 );
469 BOOST_TEST( model->m_ramp.m_falling.value[2].m_dv == 0.475 );
470 BOOST_TEST( model->m_ramp.m_falling.value[2].m_dt == 90e-12 );
471
472 BOOST_TEST( model->m_risingWaveforms.size() == 2 );
473 BOOST_TEST( (int) model->m_risingWaveforms[0]->m_type == (int) IBIS_WAVEFORM_TYPE::RISING );
474 BOOST_TEST( model->m_risingWaveforms[0]->m_R_fixture == 50.0 );
475 BOOST_TEST( model->m_risingWaveforms[0]->m_V_fixture == 1.35 );
476 BOOST_TEST( model->m_risingWaveforms[0]->m_V_fixture_min == 1.28 );
477 BOOST_TEST( model->m_risingWaveforms[0]->m_V_fixture_max == 1.42 );
478 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries.size() == 4 );
479 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[0].t == 0 );
480 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[0].V.value[0] == 0.6179 );
481 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[0].V.value[1] == 0.5969 );
482 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[0].V.value[2] == 0.6325 );
483 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[1].t == 199e-12 );
484 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[1].V.value[0] == 0.9465 );
485 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[1].V.value[1] == 0.8243 );
486 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[1].V.value[2] == 1.1430 );
487 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[2].t == 399e-12 );
488 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[2].V.value[0] == 1.340 );
489 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[2].V.value[1] == 1.261 );
490 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[2].V.value[2] == 1.420 );
491 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[3].t == 937e-12 );
492 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[3].V.value[0] == 1.349 );
493 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[3].V.value[1] == 1.282 );
494 BOOST_TEST( model->m_risingWaveforms[0]->m_table.m_entries[3].V.value[2] == 1.424 );
495
496 BOOST_TEST( model->m_fallingWaveforms.size() == 2 );
497 BOOST_TEST( (int) model->m_fallingWaveforms[0]->m_type == (int) IBIS_WAVEFORM_TYPE::FALLING );
498 BOOST_TEST( model->m_fallingWaveforms[0]->m_R_fixture == 50.0 );
499 BOOST_TEST( model->m_fallingWaveforms[0]->m_V_fixture == 1.35 );
500 BOOST_TEST( model->m_fallingWaveforms[0]->m_V_fixture_min == 1.28 );
501 BOOST_TEST( model->m_fallingWaveforms[0]->m_V_fixture_max == 1.42 );
502 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries.size() == 4 );
503 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[0].t == 0 );
504 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[0].V.value[0] == 1.349 );
505 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[0].V.value[1] == 1.282 );
506 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[0].V.value[2] == 1.424 );
507 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[1].t == 198e-12 );
508 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[1].V.value[0] == 1.270 );
509 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[1].V.value[1] == 1.248 );
510 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[1].V.value[2] == 1.203 );
511 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[2].t == 398e-12 );
512 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[2].V.value[0] == 0.6815 );
513 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[2].V.value[1] == 0.7726 );
514 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[2].V.value[2] == 0.6551 );
515 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[3].t == 937e-12 );
516 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[3].V.value[0] == 0.6179 );
517 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[3].V.value[1] == 0.5969);
518 BOOST_TEST( model->m_fallingWaveforms[0]->m_table.m_entries[3].V.value[2] == 0.6325 );
519
520 BOOST_TEST( model->m_submodels.size() == 1 );
521 BOOST_TEST( model->m_submodels[0].m_name == "40ohm_ODT" );
522 BOOST_TEST( (int) model->m_submodels[0].m_type == (int) IBIS_SUBMODEL_TYPE::DYNAMIC_CLAMP );
523 BOOST_TEST( (int) model->m_submodels[0].m_mode == (int) IBIS_SUBMODEL_MODE::NON_DRIVING );
524
525 BOOST_TEST( model->m_submodels[0].HasGNDClamp() );
526 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries.size() == 4 );
527 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[0].V == -1.35 );
528 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[0].I.value[0] == -6.975e-3 );
529 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[0].I.value[1] == -6.287e-3 );
530 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[0].I.value[2] == -7.776e-3 );
531 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[1].V == 0.0 );
532 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[1].I.value[0] == -1.585e-6 );
533 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[1].I.value[1] == -2.224e-6 );
534 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[1].I.value[2] == -819.6e-9 );
535 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[2].V == 1.35 );
536 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[2].I.value[0] == 12.86e-3 );
537 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[2].I.value[1] == 11.10e-3 );
538 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[2].I.value[2] == 14.96e-3 );
539 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[3].V == 2.7 );
540 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[3].I.value[0] == 15.10e-3 );
541 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[3].I.value[1] == 12.73e-3 );
542 BOOST_TEST( model->m_submodels[0].m_GNDClamp.m_entries[3].I.value[2] == 18.50e-3 );
543
544 BOOST_TEST( model->m_submodels[0].HasPOWERClamp() );
545 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries.size() == 4 );
546 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[0].V == -1.35 );
547 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[0].I.value[0] == 3.515e-3 );
548 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[0].I.value[1] == 3.706e-3 );
549 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[0].I.value[2] == 4.312e-3 );
550 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[1].V == 0.0 );
551 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[1].I.value[0] == 13.01e-6 );
552 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[1].I.value[1] == 18.85e-6 );
553 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[1].I.value[2] == 5.723e-6 );
554 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[2].V == 1.35 );
555 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[2].I.value[0] == -10.50e-3 );
556 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[2].I.value[1] == -9.514e-3 );
557 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[2].I.value[2] == -12.39e-3 );
558 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[3].V == 2.7 );
559 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[3].I.value[0] == -12.88e-3 );
560 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[3].I.value[1] == -11.66e-3 );
561 BOOST_TEST( model->m_submodels[0].m_POWERClamp.m_entries[3].I.value[2] == -15.26e-3 );
562}
563
void Report(const std::string &aMsg, SEVERITY aSeverity=RPT_SEVERITY_INFO) const
Print a message.
Definition ibis_parser.h:68
REPORTER * m_Reporter
Definition ibis_parser.h:75
bool m_valid
Definition kibis.h:57
Definition kibis.h:488
A wrapper for reporting to a wxString object.
Definition reporter.h:191
const wxString & GetMessages() const
Definition reporter.cpp:77
std::string GetEeschemaTestDataDir()
Get the configured location of Eeschema test data.
@ RPT_SEVERITY_INFO
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_AUTO_TEST_SUITE_END()
std::string path
BOOST_AUTO_TEST_CASE(Null)
KIBIS_MODEL * model
KIBIS top(path, &reporter)
BOOST_TEST_INFO("Parsed: "<< path)
BOOST_TEST(top.m_valid)
KIBIS_COMPONENT * comp
KIBIS_PIN * pin
BOOST_REQUIRE(comp !=nullptr)