13
13
14
14
#include " miniBDD.h"
15
15
16
- #include < cassert >
16
+ #include < util/invariant.h >
17
17
18
18
#include < iostream>
19
19
22
22
23
23
void mini_bdd_nodet::remove_reference ()
24
24
{
25
- // NOLINTNEXTLINE(build/deprecated)
26
- assert ( reference_counter!= 0 );
25
+ PRECONDITION_WITH_DIAGNOSTICS (
26
+ reference_counter != 0 , " all references were already removed " );
27
27
28
28
reference_counter--;
29
29
@@ -209,10 +209,12 @@ class mini_bdd_applyt
209
209
210
210
mini_bddt mini_bdd_applyt::APP_rec (const mini_bddt &x, const mini_bddt &y)
211
211
{
212
- // NOLINTNEXTLINE(build/deprecated)
213
- assert (x.is_initialized () && y.is_initialized ());
214
- // NOLINTNEXTLINE(build/deprecated)
215
- assert (x.node ->mgr ==y.node ->mgr );
212
+ PRECONDITION_WITH_DIAGNOSTICS (
213
+ x.is_initialized () && y.is_initialized (),
214
+ " apply can only be called on initialized BDDs" );
215
+ PRECONDITION_WITH_DIAGNOSTICS (
216
+ x.node ->mgr == y.node ->mgr ,
217
+ " apply can only be called on BDDs with the same manager" );
216
218
217
219
// dynamic programming
218
220
std::pair<unsigned , unsigned > key (x.node_number (), y.node_number ());
@@ -273,10 +275,13 @@ mini_bddt mini_bdd_applyt::APP_non_rec(
273
275
auto &t=stack.top ();
274
276
const mini_bddt &x=t.x ;
275
277
const mini_bddt &y=t.y ;
276
- // NOLINTNEXTLINE(build/deprecated)
277
- assert (x.is_initialized () && y.is_initialized ());
278
- // NOLINTNEXTLINE(build/deprecated)
279
- assert (x.node ->mgr ==y.node ->mgr );
278
+
279
+ INVARIANT (
280
+ x.is_initialized () && y.is_initialized (),
281
+ " apply can only be called on initialized BDDs" );
282
+ INVARIANT (
283
+ x.node ->mgr == y.node ->mgr ,
284
+ " apply can only be called on BDDs with the same manager" );
280
285
281
286
switch (t.phase )
282
287
{
@@ -302,36 +307,42 @@ mini_bddt mini_bdd_applyt::APP_non_rec(
302
307
{
303
308
t.var =x.var ();
304
309
t.phase =stack_elementt::phaset::FINISH;
305
- // NOLINTNEXTLINE(build/deprecated)
306
- assert (x.low ().var ()>t.var );
307
- // NOLINTNEXTLINE(build/deprecated)
308
- assert (y.low ().var ()>t.var );
309
- // NOLINTNEXTLINE(build/deprecated)
310
- assert (x.high ().var ()>t.var );
311
- // NOLINTNEXTLINE(build/deprecated)
312
- assert (y.high ().var ()>t.var );
310
+
311
+ INVARIANT (
312
+ x.low ().var () > t.var , " applying won't break variable order" );
313
+ INVARIANT (
314
+ y.low ().var () > t.var , " applying won't break variable order" );
315
+ INVARIANT (
316
+ x.high ().var () > t.var , " applying won't break variable order" );
317
+ INVARIANT (
318
+ y.high ().var () > t.var , " applying won't break variable order" );
319
+
313
320
stack.push (stack_elementt (t.lr , x.low (), y.low ()));
314
321
stack.push (stack_elementt (t.hr , x.high (), y.high ()));
315
322
}
316
323
else if (x.var ()<y.var ())
317
324
{
318
325
t.var =x.var ();
319
326
t.phase =stack_elementt::phaset::FINISH;
320
- // NOLINTNEXTLINE(build/deprecated)
321
- assert (x.low ().var ()>t.var );
322
- // NOLINTNEXTLINE(build/deprecated)
323
- assert (x.high ().var ()>t.var );
327
+
328
+ INVARIANT (
329
+ x.low ().var () > t.var , " applying won't break variable order" );
330
+ INVARIANT (
331
+ x.high ().var () > t.var , " applying won't break variable order" );
332
+
324
333
stack.push (stack_elementt (t.lr , x.low (), y));
325
334
stack.push (stack_elementt (t.hr , x.high (), y));
326
335
}
327
336
else /* x.var() > y.var() */
328
337
{
329
338
t.var =y.var ();
330
339
t.phase =stack_elementt::phaset::FINISH;
331
- // NOLINTNEXTLINE(build/deprecated)
332
- assert (y.low ().var ()>t.var );
333
- // NOLINTNEXTLINE(build/deprecated)
334
- assert (y.high ().var ()>t.var );
340
+
341
+ INVARIANT (
342
+ y.low ().var () > t.var , " applying won't break variable order" );
343
+ INVARIANT (
344
+ y.high ().var () > t.var , " applying won't break variable order" );
345
+
335
346
stack.push (stack_elementt (t.lr , x, y.low ()));
336
347
stack.push (stack_elementt (t.hr , x, y.high ()));
337
348
}
@@ -350,8 +361,8 @@ mini_bddt mini_bdd_applyt::APP_non_rec(
350
361
}
351
362
}
352
363
353
- // NOLINTNEXTLINE(build/deprecated)
354
- assert ( u.is_initialized ());
364
+ POSTCONDITION_WITH_DIAGNOSTICS (
365
+ u.is_initialized (), " the resulting BDD is initialized " );
355
366
356
367
return u;
357
368
}
@@ -378,8 +389,8 @@ mini_bddt mini_bddt::operator^(const mini_bddt &other) const
378
389
379
390
mini_bddt mini_bddt::operator !() const
380
391
{
381
- // NOLINTNEXTLINE(build/deprecated)
382
- assert ( is_initialized ());
392
+ PRECONDITION_WITH_DIAGNOSTICS (
393
+ is_initialized (), " BDD has to be initialized for negation " );
383
394
return node->mgr ->True ()^*this ;
384
395
}
385
396
@@ -421,12 +432,13 @@ mini_bddt mini_bdd_mgrt::mk(
421
432
const mini_bddt &low,
422
433
const mini_bddt &high)
423
434
{
435
+ PRECONDITION_WITH_DIAGNOSTICS (
436
+ var <= var_table.size (), " cannot make a BDD for an unknown variable" );
437
+ PRECONDITION_WITH_DIAGNOSTICS (
438
+ low.var () > var, " low-edge would break variable ordering" );
424
439
// NOLINTNEXTLINE(build/deprecated)
425
- assert (var<=var_table.size ());
426
- // NOLINTNEXTLINE(build/deprecated)
427
- assert (low.var ()>var);
428
- // NOLINTNEXTLINE(build/deprecated)
429
- assert (high.var ()>var);
440
+ PRECONDITION_WITH_DIAGNOSTICS (
441
+ high.var () > var, " high-edge would break variable ordering" );
430
442
431
443
if (low.node_number ()==high.node_number ())
432
444
return low;
@@ -525,8 +537,9 @@ mini_bddt restrictt::RES(const mini_bddt &u)
525
537
{
526
538
// replace 'var' in 'u' by constant 'value'
527
539
528
- // NOLINTNEXTLINE(build/deprecated)
529
- assert (u.is_initialized ());
540
+ PRECONDITION_WITH_DIAGNOSTICS (
541
+ u.is_initialized (),
542
+ " restricting variables can only be done in initialized BDDs" );
530
543
mini_bdd_mgrt *mgr=u.node ->mgr ;
531
544
532
545
mini_bddt t;
0 commit comments