what
This commit is contained in:
		| @@ -34,6 +34,9 @@ namespace tmpl { | |||||||
|  |  | ||||||
|                  |                  | ||||||
| export deftype power (bool?! vdd, vss) { } | export deftype power (bool?! vdd, vss) { } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| export template<pint N; pbool invert> | export template<pint N; pbool invert> | ||||||
| defproc ortree (bool? in[N]; bool out) | defproc ortree (bool? in[N]; bool out) | ||||||
| { | { | ||||||
| @@ -43,14 +46,48 @@ defproc ortree (bool? in[N]; bool out) | |||||||
|  |  | ||||||
|   pint i, end, j; |   pint i, end, j; | ||||||
|   pbool isinv; |   pbool isinv; | ||||||
|   isinv = false; |   isinv = invert; | ||||||
|   i = 0; |   i = 0; | ||||||
|   end = N-1; |   end = N-1; | ||||||
|  |  | ||||||
|   /* dynamic array that holds all the nodes in the completion tree */ |   pint lenTree2Count, lenTree3Count; | ||||||
|   bool tmp[N]; |   /* Pre"calculate" the number of C cells required, look below if confused */ | ||||||
|  |   *[ i != end -> | ||||||
|  |      j = 0; | ||||||
|  |      *[ i < end -> | ||||||
|  |         j = j + 1; | ||||||
|  |         [ i+1 >= end -> | ||||||
|  |           i = end; | ||||||
|  |           lenTree2Count = lenTree2Count +1; | ||||||
|  |         [] i+2 >= end -> | ||||||
|  |           i = end; | ||||||
|  |           lenTree3Count = lenTree3Count +1; | ||||||
|  |         [] else -> | ||||||
|  |           i = i + 2; | ||||||
|  |           lenTree2Count = lenTree2Count +1; | ||||||
|  |         ] | ||||||
|  |       ] | ||||||
|  |       /*-- update range that has to be combined --*/ | ||||||
|  |       i = end+1; | ||||||
|  |       end = end+j; | ||||||
|  |       j = 0; | ||||||
|  |   ] | ||||||
|  |  | ||||||
|  |   /* array that holds ALL the nodes in the completion tree */ | ||||||
|  |   bool tmp[end]; | ||||||
|   (k:N:tmp[k] = in[k];) |   (k:N:tmp[k] = in[k];) | ||||||
|  |  | ||||||
|  |   /* array to hold the actual C-elments, either A2C or A3C */ | ||||||
|  |   OR2_X1 C2Els[lenTree2Count]; | ||||||
|  |   OR3_X1 C3Els[lenTree3Count]; | ||||||
|  |  | ||||||
|  |   /* Reset the variables we just stole lol */ | ||||||
|  |   i = 0; | ||||||
|  |   end = N-1; | ||||||
|  |   j = 0; | ||||||
|  |   pint tree2Index = 0; | ||||||
|  |   pint tree3Index = 0; | ||||||
|  |  | ||||||
|   /* Invariant: i <= end */ |   /* Invariant: i <= end */ | ||||||
|      |      | ||||||
|   *[ i != end -> |   *[ i != end -> | ||||||
| @@ -64,51 +101,36 @@ defproc ortree (bool? in[N]; bool out) | |||||||
|         /*-- there are still signals that need to be combined --*/ |         /*-- there are still signals that need to be combined --*/ | ||||||
|         j = j + 1; |         j = j + 1; | ||||||
|         bool tmp[end+j..end+j]; |         bool tmp[end+j..end+j]; | ||||||
|         [ i+2 >= end -> |         [ i+1 >= end -> | ||||||
|           /*-- last piece: use either a 2 or 3 input NAND/NOR gate --*/ |           /*-- last piece: use either a 2 input C-element --*/ | ||||||
|           [isinv -> |           C2Els[tree2Index].c1 = tmp[i]; | ||||||
|             prs { (&k:i..end:tmp[k]) => tmp[end+j]- } |           C2Els[tree2Index].c2 = tmp[i+1]; | ||||||
|           [] else -> |           C2Els[tree2Index].y = tmp[end+j]; | ||||||
|             prs { (|k:i..end:tmp[k]) => tmp[end+j]- } |           tree2Index = tree2Index +1; | ||||||
|           ] |           i = end; | ||||||
|  |         [] i+2 >= end -> | ||||||
|  |           /*-- last piece: use either a 3 input C-element --*/ | ||||||
|  |           C3Els[tree3Index].c1 = tmp[i]; | ||||||
|  |           C3Els[tree3Index].c2 = tmp[i+1]; | ||||||
|  |           C3Els[tree3Index].c3 = tmp[i+2]; | ||||||
|  |           C3Els[tree3Index].y = tmp[end+j]; | ||||||
|  |  | ||||||
|  |           tree3Index = tree3Index +1; | ||||||
|           i = end; |           i = end; | ||||||
|         [] else -> |         [] else -> | ||||||
|           /*-- more to come; so use a two input C-element --*/ |           /*-- more to come; so use a two input C-element --*/ | ||||||
|           [isinv -> |           C2Els[tree2Index].c1 = tmp[i]; | ||||||
|             prs { (&k:i..i+1:tmp[k]) => tmp[end+j]- } |           C2Els[tree2Index].c2 = tmp[i+1]; | ||||||
|           [] else -> |           C2Els[tree2Index].y = tmp[end+j]; | ||||||
|             prs { (|k:i..i+1:tmp[k]) => tmp[end+j]- } |           tree2Index = tree2Index +1; | ||||||
|           ] |  | ||||||
|           i = i + 2; |           i = i + 2; | ||||||
|         ] |         ] | ||||||
|         sizing { |  | ||||||
|           leak_adjust <- 1;  |  | ||||||
|           p_n_mode <- 1; |  | ||||||
|           tmp[end+j]{-1} |  | ||||||
|         } |  | ||||||
|       ] |       ] | ||||||
|       /*-- we just added an inverting layer --*/ |  | ||||||
|       isinv = ~isinv; |  | ||||||
|  |  | ||||||
|       /*-- update range that has to be combined --*/ |       /*-- update range that has to be combined --*/ | ||||||
|       i = end+1; |       i = end+1; | ||||||
|       end = end+j; |       end = end+j; | ||||||
|       j = 0; |       j = 0; | ||||||
|   ] |   ] | ||||||
|  |  | ||||||
|   isinv = invert ? ~isinv : isinv; |  | ||||||
|  |  | ||||||
|   /*-- invert the signal if needed --*/ |  | ||||||
|   [isinv -> prs { tmp[end] => out- }  |  | ||||||
|   [] else -> tmp[end] = out; |  | ||||||
|   ] |  | ||||||
|   [isinv -> |  | ||||||
|   sizing { |  | ||||||
|     leak_adjust <- 1;  |  | ||||||
|     p_n_mode <- 1; |  | ||||||
|     out{-1} |  | ||||||
|   } |  | ||||||
|   ] |  | ||||||
| } | } | ||||||
|    |    | ||||||
| /* | /* | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user