Main Page | Class List | File List | Class Members | File Members

fold_unfold.c

Go to the documentation of this file.
00001 extern "C" {
00002 
00003 #include "tarski.h"
00004 
00005 extern F
00006 build_fold_unfold_wrapper();
00007 
00008 F 
00009 build_fold_unfold_check()
00010 {
00011   F fold_neq_unfold = build_fold_unfold_wrapper();
00012   Fnode *bmc_problem = node_tfe(fold_neq_unfold.raw, 10);
00013   Net_t *neq_net;
00014   //neq_net = Net_CreateFromFormula(fold_neq_unfold.raw);
00015   neq_net = Net_CreateFromFormula(bmc_problem);
00016   
00017   Net_DoBryantReduction(neq_net);
00018   Net_t *bry_neq_net = Net_CreateFromFormula(array_fetch(Fnode *, neq_net->formulas, 0));
00019 
00020   //st_table *processedTable = st_init_table( (int (*)() ) st_ptrcmp, (int (*)() ) st_ptrhash );
00021   //Net_PrintFormula(neq_net, array_fetch(Fnode *, neq_net->formulas,0),  processedTable);
00022   //Net_PrintVHDL(neq_net, stdout, 4);
00023   Net_PrintVHDL(bry_neq_net, 4, "fold_unfold.vhdl", "fold_unfold");
00024   return fold_neq_unfold;  
00025 }
00026 
00027 F 
00028 build_fold_unfold_wrapper()
00029 {
00030   
00031   F oscillator = br("oscillator");
00032   F next_oscillator = !oscillator;
00033   oscillator << (FALSE() % next_oscillator);
00034 
00035   F xdata1 = si("xdata1");
00036   F xdata2 = si("xdata2");
00037   F xdata3 = si("xdata3");
00038   F xdata4 = si("xdata4");
00039   
00040   F fold_xdata_reg1 = sr("fold_xdata_reg1");
00041   F fold_xdata_reg2 = sr("fold_xdata_reg2");
00042   F fold_xdata_reg3 = sr("fold_xdata_reg3");
00043   F fold_xdata_reg4 = sr("fold_xdata_reg4");
00044   
00045   fold_xdata_reg1 << (xdata1 % fold_xdata_reg2);
00046   fold_xdata_reg2 << (xdata2 % fold_xdata_reg3);
00047   fold_xdata_reg3 << (xdata3 % fold_xdata_reg4);
00048   fold_xdata_reg4 << (xdata4 % fold_xdata_reg4);
00049 
00050   F ydata_n_minus_1 = si("ydata_n_minus_1");
00051   F ydata_n_minus_2 = si("ydata_n_minus_2");
00052   F ydata_n_minus_3 = si("ydata_n_minus_3");
00053 
00054   F fold_ydata_n_minus_1 = sr("fold_ydata_n_minus_1");
00055   F fold_ydata_n_minus_2 = sr("fold_ydata_n_minus_2");
00056   F fold_ydata_n_minus_3 = sr("fold_ydata_n_minus_3");
00057   
00058   F adata_reg = sr("adata_reg");
00059   F bdata_reg = sr("bdata_reg");
00060   
00061   F adata = si("adata");
00062   F bdata = si("bdata");
00063   
00064   adata_reg << (adata % adata_reg);
00065   bdata_reg << (bdata % bdata_reg);
00066   
00067   F fold_a_y_minus_2 = uif2("multiply", adata_reg, fold_ydata_n_minus_2);
00068   
00069   F fold_b_y_minus_3 = uif2("multiply", bdata_reg, fold_ydata_n_minus_3);
00070   
00071   F fold_intermediate_add = uif2("add", fold_a_y_minus_2, fold_b_y_minus_3);
00072 
00073   F fold_ydata = uif2("add", fold_intermediate_add, fold_xdata_reg1);
00074   
00075   fold_ydata_n_minus_1 << (ydata_n_minus_1 % fold_ydata);
00076   fold_ydata_n_minus_2 << (ydata_n_minus_2 % fold_ydata_n_minus_1);
00077   fold_ydata_n_minus_3 << (ydata_n_minus_3 % fold_ydata_n_minus_2);
00078   
00079   // Now we concentrate on unfolding
00080   
00081   F unfold_freeze = !oscillator;
00082 
00083   F unfold_xdata_reg1 = sr("unfold_xdata_reg1");
00084   F unfold_xdata_reg2 = sr("unfold_xdata_reg2");
00085   F unfold_xdata_reg3 = sr("unfold_xdata_reg3");
00086   F unfold_xdata_reg4 = sr("unfold_xdata_reg4");
00087   
00088   F next_unfold_xdata_reg1 = mux(unfold_freeze,
00089                                  unfold_xdata_reg1,
00090                                  unfold_xdata_reg3);
00091   
00092   F next_unfold_xdata_reg2 = mux(unfold_freeze,
00093                                  unfold_xdata_reg2,
00094                                  unfold_xdata_reg4);
00095   
00096   
00097   F next_unfold_xdata_reg3 = mux(unfold_freeze,
00098                                  unfold_xdata_reg3,
00099                                  unfold_xdata_reg4);
00100   
00101   F next_unfold_xdata_reg4 = mux(unfold_freeze,
00102                                  unfold_xdata_reg4,
00103                                  unfold_xdata_reg4);
00104   
00105   unfold_xdata_reg1 << (xdata1 % next_unfold_xdata_reg1);
00106   unfold_xdata_reg2 << (xdata2 % next_unfold_xdata_reg2);
00107   unfold_xdata_reg3 << (xdata3 % next_unfold_xdata_reg3);
00108   unfold_xdata_reg4 << (xdata4 % next_unfold_xdata_reg4);
00109 
00110   F unfold_ydata_n_minus_1 = sr("unfold_ydata_n_minus_1");
00111   F unfold_ydata_n_minus_2 = sr("unfold_ydata_n_minus_2");
00112   F unfold_ydata_n_minus_3 = sr("unfold_ydata_n_minus_3");
00113   
00114   F unfold_a_y_minus_2 = uif2("multiply", adata_reg, unfold_ydata_n_minus_2);
00115   F unfold_a_y_minus_1 = uif2("multiply", adata_reg, unfold_ydata_n_minus_1);
00116   
00117   F unfold_b_y_minus_3 = uif2("multiply", bdata_reg, unfold_ydata_n_minus_3);
00118   F unfold_b_y_minus_2 = uif2("multiply", bdata_reg, unfold_ydata_n_minus_2);
00119   
00120   F unfold_intermediate_add1 = uif2("add", unfold_a_y_minus_2, unfold_b_y_minus_3);
00121   F unfold_intermediate_add2 = uif2("add", unfold_a_y_minus_1, unfold_b_y_minus_2);
00122   
00123   F unfold_ydata = uif2("add", unfold_intermediate_add1, unfold_xdata_reg1);
00124   F unfold_ydata_plus_1 = uif2("add", unfold_intermediate_add2, unfold_xdata_reg2);
00125   
00126   F next_unfold_ydata_n_minus_1 = mux(unfold_freeze,
00127                                       unfold_ydata_n_minus_1,
00128                                       unfold_ydata_plus_1);
00129   
00130   F next_unfold_ydata_n_minus_2 = mux(unfold_freeze,
00131                                       unfold_ydata_n_minus_2,
00132                                       unfold_ydata);
00133   
00134   F next_unfold_ydata_n_minus_3 = mux(unfold_freeze,
00135                                       unfold_ydata_n_minus_3,
00136                                       unfold_ydata_n_minus_1);
00137   
00138   unfold_ydata_n_minus_1 << (ydata_n_minus_1 % next_unfold_ydata_n_minus_1);
00139   unfold_ydata_n_minus_2 << (ydata_n_minus_2 % next_unfold_ydata_n_minus_2);
00140   unfold_ydata_n_minus_3 << (ydata_n_minus_3 % next_unfold_ydata_n_minus_3);
00141   
00142   F check_assert = ((!oscillator & !(fold_ydata == unfold_ydata)) | (oscillator & !(fold_ydata == unfold_ydata_plus_1)));
00143   return check_assert;
00144 }
00145 
00146 
00147 }

Generated on Thu Oct 11 11:47:27 2007 for Tarski by  doxygen 1.3.9.1