22 std::set<storm::expressions::Variable>
const& stateVariables,
27 blockVariable(blockVariable),
28 stateVariables(stateVariables),
29 nondeterminismVariables(nondeterminismVariables),
30 nonBlockVariables(nonBlockVariables),
32 numberOfBlockVariables(manager.getMetaVariable(blockVariable).getNumberOfDdVariables()),
33 blockCube(manager.getMetaVariable(blockVariable).getCube()),
34 nextFreeBlockIndex(0),
35 numberOfRefinements(0),
36 currentCapacity(1ull << 20),
130 SPAWN(sylvan_rehash, first, count / 2, refiner);
131 CALL(sylvan_rehash, first + count / 2, count - count / 2, refiner);
137 uint64_t* old_ptr = refiner->oldTable.data() + first * 3;
138 uint64_t a = old_ptr[0];
139 uint64_t b = old_ptr[1];
140 uint64_t c = old_ptr[2];
143 uint64_t pos = hash % refiner->currentCapacity;
145 volatile uint64_t* ptr = 0;
147 ptr = refiner->table.data() + pos * 3;
149 if (
cas(ptr, 0, a)) {
156 if (pos >= refiner->currentCapacity)
238TASK_3(BDD, sylvan_encode_block, BDD, vars, uint64_t, numberOfVariables, uint64_t, blockIndex) {
239 std::vector<uint8_t> e(numberOfVariables);
240 for (uint64_t i = 0; i < numberOfVariables; ++i) {
241 e[i] = blockIndex & 1 ? 1 : 0;
244 return sylvan_cube(vars, e.data());
248 assert(previous_block != mtbdd_false);
253 if (sig == sylvan_false) {
258 if (refiner->options.reuseBlockNumbers) {
260 assert(previous_block != sylvan_false);
261 const uint64_t p_b = CALL(sylvan_decode_block, previous_block);
262 assert(p_b < refiner->signatures.size());
265 BDD cur = *(
volatile BDD*)&refiner->signatures[p_b];
267 return previous_block;
270 if (
cas(&refiner->signatures[p_b], 0, sig))
271 return previous_block;
278 CALL(sylvan_grow, refiner);
281 return CALL(sylvan_encode_block, refiner->blockCube.getInternalBdd().getSylvanBdd().GetBDD(), refiner->numberOfBlockVariables, c);
284TASK_5(BDD, sylvan_refine_partition, BDD, dd, BDD, previous_partition, BDD, nondetvars, BDD, vars,
InternalSylvanSignatureRefinerBase*, refiner) {
289 if (previous_partition == sylvan_false) {
294 if (sylvan_set_isempty(vars)) {
296 if (cache_get(dd | (256LL << 42), vars, previous_partition | (refiner->numberOfRefinements << 40), &result))
298 result = CALL(sylvan_assign_block, dd, previous_partition, refiner);
299 cache_put(dd | (256LL << 42), vars, previous_partition | (refiner->numberOfRefinements << 40), result);
308 BDDVAR dd_var = sylvan_isconst(dd) ? 0xffffffff : sylvan_var(dd);
309 BDDVAR pp_var = sylvan_var(previous_partition);
310 BDDVAR vars_var = sylvan_var(vars);
311 BDDVAR nondetvars_var = sylvan_isconst(nondetvars) ? 0xffffffff : sylvan_var(nondetvars);
312 bool nondet = nondetvars_var == vars_var;
313 uint64_t offset = (nondet || !refiner->options.shiftStateVariables) ? 0 : 1;
315 while (vars_var < dd_var && vars_var + offset < pp_var) {
316 vars = sylvan_set_next(vars);
318 nondetvars = sylvan_set_next(nondetvars);
320 if (sylvan_set_isempty(vars))
321 return CALL(sylvan_refine_partition, dd, previous_partition, nondetvars, vars, refiner);
322 vars_var = sylvan_var(vars);
324 nondetvars_var = sylvan_isconst(nondetvars) ? 0xffffffff : sylvan_var(nondetvars);
325 nondet = nondetvars_var == vars_var;
326 offset = (nondet || !refiner->options.shiftStateVariables) ? 0 : 1;
332 if (cache_get(dd | (256LL << 42), vars, previous_partition | (refiner->numberOfRefinements << 40), &result)) {
338 if (vars_var == dd_var) {
339 dd_low = sylvan_low(dd);
340 dd_high = sylvan_high(dd);
342 dd_low = dd_high = dd;
346 if (vars_var + offset == pp_var) {
347 pp_low = sylvan_low(previous_partition);
348 pp_high = sylvan_high(previous_partition);
350 pp_low = pp_high = previous_partition;
354 BDD next_vars = sylvan_set_next(vars);
355 BDD next_nondetvars = nondet ? sylvan_set_next(nondetvars) : nondetvars;
356 bdd_refs_spawn(SPAWN(sylvan_refine_partition, dd_low, pp_low, next_nondetvars, next_vars, refiner));
357 BDD high = bdd_refs_push(CALL(sylvan_refine_partition, dd_high, pp_high, next_nondetvars, next_vars, refiner));
358 BDD low = bdd_refs_sync(SYNC(sylvan_refine_partition));
362 result = sylvan_makenode(vars_var + offset, low, high);
365 cache_put(dd | (256LL << 42), vars, previous_partition | (refiner->numberOfRefinements << 40), result);