Skip to content

Commit 92f274d

Browse files
committed
Work in progress, improved file format.
TODO: consider ASCII format? (Harder to parse) Also, do the same for BDDs / MTBDDs.
1 parent 1ca6868 commit 92f274d

2 files changed

Lines changed: 63 additions & 19 deletions

File tree

examples/lddmc.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,18 @@ TASK_0(int, run)
769769
INFO("Read file '%s'\n", model_filename);
770770
INFO("%d integers per state, %d transition groups\n", vector_size, next_count);
771771

772+
if (report_nodes) {
773+
// TODO we need to see the size of the forest, not just add the nodes like this?
774+
/*MDD* arr = malloc(sizeof(MDD*)*next_count);
775+
for (int i=0; i<next_count; i++) {
776+
arr[i] = next[i]->dd;
777+
}*/
778+
size_t nodecount = 0;
779+
for (int i=0; i<next_count; i++) nodecount += lddmc_nodecount(next[i]->dd);
780+
INFO("Transitions: %zu MDD nodes\n", nodecount);
781+
}
782+
783+
772784
if (print_transition_matrix) {
773785
for (int i=0; i<next_count; i++) {
774786
INFO("");

src/sylvan_ldd.c

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2564,16 +2564,22 @@ lddmc_serialize_tofile(FILE *out)
25642564

25652565
mddnode_t n = LDD_GETNODE(s->mdd);
25662566

2567-
struct mddnode node;
25682567
uint64_t right = lddmc_serialize_get(mddnode_getright(n));
25692568
uint64_t down = lddmc_serialize_get(mddnode_getdown(n));
2570-
if (mddnode_getcopy(n)) mddnode_makecopy(&node, right, down);
2571-
else mddnode_make(&node, mddnode_getvalue(n), right, down);
25722569

2573-
assert(right <= index);
2574-
assert(down <= index);
2575-
2576-
fwrite(&node, sizeof(struct mddnode), 1, out);
2570+
if (mddnode_getcopy(n)) {
2571+
char copy = 1;
2572+
fwrite(&copy, 1, 1, out);
2573+
fwrite(&right, 8, 1, out);
2574+
fwrite(&down, 8, 1, out);
2575+
} else {
2576+
char copy = 0;
2577+
fwrite(&copy, 1, 1, out);
2578+
uint32_t value = mddnode_getvalue(n);
2579+
fwrite(&value, 4, 1, out);
2580+
fwrite(&right, 8, 1, out);
2581+
fwrite(&down, 8, 1, out);
2582+
}
25772583
}
25782584

25792585
lddmc_ser_done = lddmc_ser_counter-2;
@@ -2591,22 +2597,48 @@ lddmc_serialize_fromfile(FILE *in)
25912597
}
25922598

25932599
for (i=1; i<=count; i++) {
2594-
struct mddnode node;
2595-
if (fread(&node, sizeof(struct mddnode), 1, in) != 1) {
2596-
// TODO FIXME return error
2600+
char copy;
2601+
if (fread(&copy, 1, 1, in) != 1) {
25972602
printf("sylvan_serialize_fromfile: file format error, giving up\n");
25982603
exit(-1);
25992604
}
2600-
2601-
assert(mddnode_getright(&node) <= lddmc_ser_done+1);
2602-
assert(mddnode_getdown(&node) <= lddmc_ser_done+1);
2603-
2604-
MDD right = lddmc_serialize_get_reversed(mddnode_getright(&node));
2605-
MDD down = lddmc_serialize_get_reversed(mddnode_getdown(&node));
2606-
26072605
struct lddmc_ser s;
2608-
if (mddnode_getcopy(&node)) s.mdd = lddmc_make_copynode(down, right);
2609-
else s.mdd = lddmc_makenode(mddnode_getvalue(&node), down, right);
2606+
if (copy == 1) {
2607+
uint64_t right, down;
2608+
if (fread(&right, 8, 1, in) != 1) {
2609+
printf("sylvan_serialize_fromfile: file format error, giving up\n");
2610+
exit(-1);
2611+
}
2612+
if (fread(&down, 8, 1, in) != 1) {
2613+
printf("sylvan_serialize_fromfile: file format error, giving up\n");
2614+
exit(-1);
2615+
}
2616+
assert(right <= lddmc_ser_done+1);
2617+
assert(down <= lddmc_ser_done+1);
2618+
MDD mdd_right = lddmc_serialize_get_reversed(right);
2619+
MDD mdd_down = lddmc_serialize_get_reversed(down);
2620+
s.mdd = lddmc_make_copynode(mdd_down, mdd_right);
2621+
} else {
2622+
uint32_t value;
2623+
uint64_t right, down;
2624+
if (fread(&value, 4, 1, in) != 1) {
2625+
printf("sylvan_serialize_fromfile: file format error, giving up\n");
2626+
exit(-1);
2627+
}
2628+
if (fread(&right, 8, 1, in) != 1) {
2629+
printf("sylvan_serialize_fromfile: file format error, giving up\n");
2630+
exit(-1);
2631+
}
2632+
if (fread(&down, 8, 1, in) != 1) {
2633+
printf("sylvan_serialize_fromfile: file format error, giving up\n");
2634+
exit(-1);
2635+
}
2636+
assert(right <= lddmc_ser_done+1);
2637+
assert(down <= lddmc_ser_done+1);
2638+
MDD mdd_right = lddmc_serialize_get_reversed(right);
2639+
MDD mdd_down = lddmc_serialize_get_reversed(down);
2640+
s.mdd = lddmc_makenode(value, mdd_down, mdd_right);
2641+
}
26102642
s.assigned = lddmc_ser_done+2; // starts at 0 but we want 2-based...
26112643
lddmc_ser_done++;
26122644

0 commit comments

Comments
 (0)