source: proto/s2k/demo/transpose/transpose_demo.py @ 3677

Last change on this file since 3677 was 3677, checked in by ksherdy, 5 years ago

Restructed s2k demo and compiler directory.

File size: 10.0 KB
Line 
1# Ken Herdy
2# August 25, 2013
3#
4# transpose -   A very simple example to demonstrate 2^3-bit to 2^0-bit transposition.
5# IDISA C++ syntax
6#
7#static void transpose(BytePack s_76543210_r7, BytePack s_76543210_r6,
8#                      BytePack s_76543210_r5, BytePack s_76543210_r4,
9#                      BytePack s_76543210_r3, BytePack s_76543210_r2,
10#                      BytePack s_76543210_r1, BytePack s_76543210_r0,
11#                      BitBlock & s_7_r0, BitBlock & s_6_r0,
12#                      BitBlock & s_5_r0, BitBlock & s_4_r0,
13#                      BitBlock & s_3_r0, BitBlock & s_2_r0,
14#                      BitBlock & s_1_r0, BitBlock & s_0_r0)
15#{
16#
17# BitBlock s_3210_r0;
18# BitBlock s_3210_r1;
19# BitBlock s_3210_r2;
20# BitBlock s_3210_r3;
21# BitBlock s_76_r0;
22# BitBlock s_76_r1;
23# BitBlock s_54_r0;
24# BitBlock s_54_r1;
25# BitBlock s_32_r0;
26# BitBlock s_32_r1;
27# BitBlock s_10_r0;
28# BitBlock s_10_r1;
29#
30# // Step 1
31#
32#       b7654_0 = hsimd<8>::packh(b76543210_1, b76543210_0);
33#       b7654_1 = hsimd<8>::packh(b76543210_2, b76543210_2);
34#       b7654_2 = hsimd<8>::packh(b76543210_5, b76543210_4);
35#       b7654_3 = hsimd<8>::packh(b76543210_7, b76543210_6);
36#       b3210_0 = hsimd<8>::packl(b76543210_1, b76543210_0);
37#       b3210_1 = hsimd<8>::packl(b76543210_2, b76543210_2);
38#       b3210_2 = hsimd<8>::packl(b76543210_5, b76543210_4);
39#       b3210_3 = hsimd<8>::packl(b76543210_7, b76543210_6);
40#
41# // Step 2
42#
43#       b76_0 = hsimd<4>::packh(b7654_1, b7654_0);
44#       b76_1 = hsimd<4>::packh(b7654_3, b7654_2);
45#       b54_0 = hsimd<4>::packl(b7654_1, b7654_0);
46#       b54_1 = hsimd<4>::packl(b7654_3, b7654_2);
47#       b32_0 = hsimd<4>::packh(b3210_1, b3210_0);
48#       b32_1 = hsimd<4>::packh(b3210_3, b3210_2);
49#       b10_0 = hsimd<4>::packl(b3210_1, b3210_0);
50#       b10_1 = hsimd<4>::packl(b3210_3, b3210_2);
51#
52# // Step 3
53#
54#       b7 = hsimd<2>::packh(b76_1, b76_0);
55#       b6 = hsimd<2>::packl(b76_1, b76_0);
56#       b5 = hsimd<2>::packh(b54_1, b54_0);
57#       b4 = hsimd<2>::packl(b54_1, b54_0);
58#       b3 = hsimd<2>::packh(b32_1, b32_0);
59#       b2 = hsimd<2>::packl(b32_1, b32_0);
60#       b1 = hsimd<2>::packh(b10_1, b10_0);
61#       b0 = hsimd<2>::packl(b10_1, b10_0);
62#}
63#
64#
65# s2k syntax
66#
67#filter transpose(in: stream<8> s_76543210,
68#                 out: stream<1> s_7, out: stream<1> s_6, out: stream<1> s_5, out: stream<1> s_4,
69#                 out: stream<1> s_3, out: stream<1> s_2, out: stream<1> s_1, out: stream<1> s_0)
70#{
71#
72#  stream<4> s_7654;
73#  stream<4> s_3210;
74#  stream<2> s_76; 
75#  stream<2> s_54; 
76#  stream<2> s_32; 
77#  stream<2> s_10;   
78#
79#  // Step 1
80#
81#  s_7654 = packh<8>(s_76543210);
82#  s_3210 = packl<8>(s_76543210);
83#
84#  // Step 2
85#
86#  s_76   = packh<4>(s_7654);
87#  s_54   = packl<4>(s_7654);
88#  s_32   = packh<4>(s_3210);
89#  s_10   = packl<4>(s_3210);
90#
91#  // Step 2
92#
93#  s_7    = packh<2>(s_76);
94#  s_6    = packl<2>(s_76);
95#  s_5    = packh<2>(s_54);
96#  s_4    = packl<2>(s_54);
97#  s_3    = packh<2>(s_32);
98#  s_2    = packl<2>(s_32);
99#  s_1    = packh<2>(s_10);
100#  s_0    = packl<2>(s_10); 
101#
102#}
103#
104
105import sys
106from lib import pablo
107from lib import flow
108from lib import cast
109from lib import bitutil
110from lib import vstreams
111from lib import hstreams
112from lib import estreams
113#import optparse
114#import transpose_demo_config
115
116#zero_ch = '0'
117
118#class Basis():
119#       s_0 = 0
120#       s_1 = 0
121#       s_2 = 0
122#       s_3 = 0
123#       s_4 = 0
124#       s_5 = 0
125#       s_6 = 0
126#       s_7 = 0
127
128class Basis_bits():     
129        bit_7 = 0
130        bit_6 = 0
131        bit_5 = 0
132        bit_4 = 0
133        bit_3 = 0
134        bit_2 = 0
135        bit_1 = 0
136        bit_0 = 0
137
138# streams as integers
139def transposition(data):
140        s_76543210  = bitutil.bytes_to_strm(data[::-1]) # Little Endian
141
142        lgth = len(bin(s_76543210)[:-1])
143
144        s_7654      = hstreams.packh(8,s_76543210,lgth)
145        s_3210      = hstreams.packl(8,s_76543210,lgth)
146        s_76        = hstreams.packh(4,s_7654,lgth/2)
147        s_54        = hstreams.packl(4,s_7654,lgth/2)
148        s_32        = hstreams.packh(4,s_3210,lgth/2)
149        s_10        = hstreams.packl(4,s_3210,lgth/2)
150        s_7         = hstreams.packh(2,s_76,lgth/4)
151        s_6         = hstreams.packl(2,s_76,lgth/4)
152        s_5         = hstreams.packh(2,s_54,lgth/4)
153        s_4         = hstreams.packl(2,s_54,lgth/4)
154        s_3         = hstreams.packh(2,s_32,lgth/4)
155        s_2         = hstreams.packl(2,s_32,lgth/4)
156        s_1         = hstreams.packh(2,s_10,lgth/4)
157        s_0         = hstreams.packl(2,s_10,lgth/4)
158
159        aligned_streams = bitutil.aligned_streams([('Source Data ', data[::-1]), 
160                              ('stream<8> s_76543210 = io.read<8>(addr,3)', bitutil.strm_to_bstr(s_76543210,lgth)),
161                              ('stream<4> s_7654 = hstreams.packh<8>(s_76543210)', bitutil.strm_to_bstr(s_7654,lgth/2)),
162                              ('stream<4> s_3210 = hstreams.packl<8>(s_76543210)', bitutil.strm_to_bstr(s_3210,lgth/2)),
163                              ('stream<2> s_76 = hstreams.packh<4>(s_7654)', bitutil.strm_to_bstr(s_76,lgth/4)),
164                              ('stream<2> s_54 = hstreams.packl<4>(s_7654)', bitutil.strm_to_bstr(s_54,lgth/4)),
165                              ('stream<2> s_32 = hstreams.packh<4>(s_3120)', bitutil.strm_to_bstr(s_32,lgth/4)),
166                              ('stream<2> s_10 = hstreams.packl<4>(s_3120)', bitutil.strm_to_bstr(s_10,lgth/4)),
167                              ('stream<2> s_7 = hstreams.packh<2>(s_76)', bitutil.strm_to_bstr(s_7,lgth/8)),
168                              ('stream<2> s_6 = hstreams.packl<2>(s_76)', bitutil.strm_to_bstr(s_6,lgth/8)),
169                              ('stream<2> s_5 = hstreams.packh<2>(s_54)', bitutil.strm_to_bstr(s_5,lgth/8)),
170                              ('stream<2> s_4 = hstreams.packl<2>(s_54)', bitutil.strm_to_bstr(s_4,lgth/8)),
171                              ('stream<2> s_3 = hstreams.packh<2>(s_32)', bitutil.strm_to_bstr(s_3,lgth/8)),
172                              ('stream<2> s_2 = hstreams.packl<2>(s_32)', bitutil.strm_to_bstr(s_2,lgth/8)),
173                              ('stream<2> s_1 = hstreams.packh<2>(s_10)', bitutil.strm_to_bstr(s_1,lgth/8)),
174                              ('stream<2> s_0 = hstreams.packl<2>(s_10)', bitutil.strm_to_bstr(s_0,lgth/8))])
175
176        return aligned_streams
177
178def pablo_transposition(data, basis_bits): 
179
180  EOF_mask = pablo.transpose_streams("abc", basis_bits)
181  lgth = len(data)*8
182
183  aligned_streams = bitutil.aligned_streams([('Source Data ', data[::-1]), 
184        ("basis_bits.bit_7",  bitutil.strm_to_bstr(basis_bits.bit_7,lgth/8)),
185        ("basis_bits.bit_6",  bitutil.strm_to_bstr(basis_bits.bit_6,lgth/8)),
186        ("basis_bits.bit_5",  bitutil.strm_to_bstr(basis_bits.bit_5,lgth/8)),
187        ("basis_bits.bit_4",  bitutil.strm_to_bstr(basis_bits.bit_4,lgth/8)),
188        ("basis_bits.bit_3",  bitutil.strm_to_bstr(basis_bits.bit_3,lgth/8)),
189        ("basis_bits.bit_2",  bitutil.strm_to_bstr(basis_bits.bit_2,lgth/8)),
190        ("basis_bits.bit_1",  bitutil.strm_to_bstr(basis_bits.bit_1,lgth/8)),
191        ("basis_bits.bit_0",  bitutil.strm_to_bstr(basis_bits.bit_0,lgth/8))])
192
193  return aligned_streams
194
195#
196# streams as binary strings
197def transposition_bstr(data): 
198
199        unbounded = len(data*8)
200        s_76543210  = bitutil.bytes_to_bstr(data[::-1]) # 'abc' -> 'cba' little endian byte and bit order |76543210|
201
202        s_7654      = hstreams.packh_bstr(8,s_76543210)
203        s_3210      = hstreams.packl_bstr(8,s_76543210)
204
205        s_76        = hstreams.packh_bstr(4,s_7654)
206        s_54        = hstreams.packl_bstr(4,s_7654)
207        s_32        = hstreams.packh_bstr(4,s_3210)
208        s_10        = hstreams.packl_bstr(4,s_3210)
209
210        s_7         = hstreams.packh_bstr(2,s_76)
211        s_6         = hstreams.packl_bstr(2,s_76)
212        s_5         = hstreams.packh_bstr(2,s_54)
213        s_4         = hstreams.packl_bstr(2,s_54)
214        s_3         = hstreams.packh_bstr(2,s_32)
215        s_2         = hstreams.packl_bstr(2,s_32)
216        s_1         = hstreams.packh_bstr(2,s_10)
217        s_0         = hstreams.packl_bstr(2,s_10)
218
219        latex_aligned_streams = bitutil.latex_aligned_streams([('Source Data `$\\vartriangleleft$\\verb`', bitutil.format_fields(data[::-1],1,8)), 
220                              ('stream<8> s_76543210 = io.read<8>(addr,3)', bitutil.format_fields(s_76543210,8,8)),
221                              ('stream<4> s_7654 = hstreams.packh<8>(s_76543210)', bitutil.format_fields(s_7654,4,8)),
222                              ('stream<4> s_3210 = hstreams.packl<8>(s_76543210)', bitutil.format_fields(s_3210,4,8)),
223                              ('stream<2> s_76 = hstreams.packh<4>(s_7654)', bitutil.format_fields(s_76,2,8)),
224                              ('stream<2> s_54 = hstreams.packl<4>(s_7654)', bitutil.format_fields(s_54,2,8)),
225                              ('stream<2> s_32 = hstreams.packh<4>(s_3120)', bitutil.format_fields(s_32,2,8)),
226                              ('stream<2> s_10 = hstreams.packl<4>(s_3120)', bitutil.format_fields(s_10,2,8)),
227                              ('stream<2> s_7 = hstreams.packh<2>(s_76)', bitutil.format_fields(s_7,1,8)),
228                              ('stream<2> s_6 = hstreams.packl<2>(s_76)', bitutil.format_fields(s_6,1,8)),
229                              ('stream<2> s_5 = hstreams.packh<2>(s_54)', bitutil.format_fields(s_5,1,8)),
230                              ('stream<2> s_4 = hstreams.packl<2>(s_54)', bitutil.format_fields(s_4,1,8)),
231                              ('stream<2> s_3 = hstreams.packh<2>(s_32)', bitutil.format_fields(s_3,1,8)),
232                              ('stream<2> s_2 = hstreams.packl<2>(s_32)', bitutil.format_fields(s_2,1,8)),
233                              ('stream<2> s_1 = hstreams.packh<2>(s_10)', bitutil.format_fields(s_1,1,8)),
234                              ('stream<2> s_0 = hstreams.packl<2>(s_10)', bitutil.format_fields(s_0,1,8))])
235
236        # for now just an easy place to try parallel int to digit
237
238        aligned_streams = bitutil.aligned_streams([('Source Data ', data[::-1]), 
239                              ('stream<8> s_76543210 = io.read<8>(addr,3)',s_76543210),
240                              ('stream<4> s_7654 = hstreams.packh<8>(s_76543210)',s_7654),
241                              ('stream<4> s_3210 = hstreams.packl<8>(s_76543210)',s_3210),
242                              ('stream<2> s_76 = hstreams.packh<4>(s_7654)',s_76),
243                              ('stream<2> s_54 = hstreams.packl<4>(s_7654)',s_54),
244                              ('stream<2> s_32 = hstreams.packh<4>(s_3120)',s_32),
245                              ('stream<2> s_10 = hstreams.packl<4>(s_3120)',s_10),
246                              ('stream<2> s_7 = hstreams.packh<2>(s_76)',s_7),
247                              ('stream<2> s_6 = hstreams.packl<2>(s_76)',s_6),
248                              ('stream<2> s_5 = hstreams.packh<2>(s_54)',s_5),
249                              ('stream<2> s_4 = hstreams.packl<2>(s_54)',s_4),
250                              ('stream<2> s_3 = hstreams.packh<2>(s_32)',s_3),
251                              ('stream<2> s_2 = hstreams.packl<2>(s_32)',s_2),
252                              ('stream<2> s_1 = hstreams.packh<2>(s_10)',s_1),
253                              ('stream<2> s_0 = hstreams.packl<2>(s_10)',s_0)])
254
255        return aligned_streams
256
257# basis = Basis()
258basis_bits = Basis_bits()
259
260if __name__ == "__main__":
261
262#  input_file = sys.argv[1]
263#  global data
264#  data          = bitutil.readfile(input_file)
265
266  print "s2k Binary String Transposition"
267  print transposition_bstr("abc")
268
269  print "s2k Stream (unbounded integer) Transposition"
270  print transposition("abc")
271
272  print "Pablo Transposition"
273  print pablo_transposition("abc", basis_bits)
274       
275
276
277
Note: See TracBrowser for help on using the repository browser.