@@ -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