@@ -343,14 +343,95 @@ module ProductFlow {
343
343
)
344
344
}
345
345
346
+ pragma [ assume_small_delta]
347
+ pragma [ nomagic]
348
+ private predicate fwdLocalPathStep1 ( Flow1:: PathNode n ) {
349
+ fwdReachableInterprocEntry ( n , _)
350
+ or
351
+ exists ( Flow1:: PathNode mid |
352
+ fwdLocalPathStep1 ( mid ) and
353
+ localPathStep1 ( mid , n )
354
+ )
355
+ }
356
+
357
+ pragma [ assume_small_delta]
358
+ pragma [ nomagic]
359
+ private predicate revLocalPathStep1 ( Flow1:: PathNode n ) {
360
+ fwdLocalPathStep1 ( n ) and
361
+ (
362
+ isSinkPair ( n , _)
363
+ or
364
+ interprocEdgePair ( n , _, _, _)
365
+ or
366
+ exists ( Flow1:: PathNode mid |
367
+ revLocalPathStep1 ( mid ) and
368
+ localPathStep1 ( n , mid )
369
+ )
370
+ )
371
+ }
372
+
373
+ pragma [ assume_small_delta]
374
+ private predicate prunedLocalPathStep1 ( Flow1:: PathNode n1 , Flow1:: PathNode n2 ) {
375
+ revLocalPathStep1 ( n1 ) and
376
+ revLocalPathStep1 ( n2 ) and
377
+ localPathStep1 ( n1 , n2 )
378
+ }
379
+
380
+ pragma [ nomagic]
381
+ private predicate fwdLocalPathStep2 ( Flow2:: PathNode n ) {
382
+ fwdReachableInterprocEntry ( _, n )
383
+ or
384
+ exists ( Flow2:: PathNode mid |
385
+ fwdLocalPathStep2 ( mid ) and
386
+ localPathStep2 ( mid , n )
387
+ )
388
+ }
389
+
390
+ pragma [ assume_small_delta]
391
+ pragma [ nomagic]
392
+ private predicate revLocalPathStep2 ( Flow2:: PathNode n ) {
393
+ fwdLocalPathStep2 ( n ) and
394
+ (
395
+ isSinkPair ( _, n )
396
+ or
397
+ interprocEdgePair ( _, n , _, _)
398
+ or
399
+ exists ( Flow2:: PathNode mid |
400
+ revLocalPathStep2 ( mid ) and
401
+ localPathStep2 ( n , mid )
402
+ )
403
+ )
404
+ }
405
+
406
+ pragma [ assume_small_delta]
407
+ private predicate prunedLocalPathStep2 ( Flow2:: PathNode n1 , Flow2:: PathNode n2 ) {
408
+ revLocalPathStep2 ( n1 ) and
409
+ revLocalPathStep2 ( n2 ) and
410
+ localPathStep2 ( n1 , n2 )
411
+ }
412
+
413
+ private predicate localPathStep1SuccPlus ( Flow1:: PathNode n1 , Flow1:: PathNode n2 ) =
414
+ fastTC( prunedLocalPathStep1 / 2 ) ( n1 , n2 )
415
+
416
+ private predicate localPathStep2SuccPlus ( Flow2:: PathNode n1 , Flow2:: PathNode n2 ) =
417
+ fastTC( prunedLocalPathStep2 / 2 ) ( n1 , n2 )
418
+
419
+ private predicate localPathStep1Tc ( Flow1:: PathNode n1 , Flow1:: PathNode n2 ) {
420
+ localPathStep1SuccPlus ( n1 , n2 ) or n1 = n2
421
+ }
422
+
423
+ private predicate localPathStep2Tc ( Flow2:: PathNode n1 , Flow2:: PathNode n2 ) {
424
+ localPathStep2SuccPlus ( n1 , n2 ) or n1 = n2
425
+ }
426
+
346
427
bindingset [ pred1, pred2]
347
428
bindingset [ succ1, succ2]
348
429
private predicate isSuccessor (
349
430
Flow1:: PathNode pred1 , Flow2:: PathNode pred2 , Flow1:: PathNode succ1 , Flow2:: PathNode succ2
350
431
) {
351
432
exists ( Flow1:: PathNode mid1 , Flow2:: PathNode mid2 |
352
- localPathStep1 * ( pred1 , mid1 ) and
353
- localPathStep2 * ( pred2 , mid2 )
433
+ localPathStep1Tc ( pred1 , mid1 ) and
434
+ localPathStep2Tc ( pred2 , mid2 )
354
435
|
355
436
isSinkPair ( mid1 , mid2 ) and
356
437
succ1 = mid1 and
0 commit comments