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
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
00021
00022
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
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 }