source: proto/s2k/demo/needle/needle_demo.py @ 3677

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

Restructed s2k demo and compiler directory.

File size: 3.5 KB
Line 
1#
2# A very simple example to demonstrate fixed string matching with parallel bit streams.
3#
4# Ken Herdy
5# Sept 8, 2013
6#
7# program flow
8#
9# StreamInput` -> Transpose` -> Classify -> Match -> CountMatches -> StreamOutput`
10#                                       
11# Back ticks ` denote functionality provided by a hand-coded C++ template.
12#
13import sys
14from lib import pablo
15from lib import bitutil
16import optparse
17import needle_demo_config
18
19class Basis_bits():     
20        bit_7 = 0
21        bit_6 = 0
22        bit_5 = 0
23        bit_4 = 0
24        bit_3 = 0
25        bit_2 = 0
26        bit_1 = 0
27        bit_0 = 0
28
29class Lex():
30        n  = 0
31        e  = 0
32        d  = 0
33        l  = 0
34       
35class Matches():
36        all = 0
37
38def ClassifyBytes(basis_bits, lex): 
39        temp1 = (basis_bits.bit_1 &~ basis_bits.bit_0)
40        temp2 = (basis_bits.bit_2 &~ basis_bits.bit_3)
41        temp3 = (temp1 & temp2)
42        temp4 = (basis_bits.bit_4 & basis_bits.bit_5)
43        temp5 = (basis_bits.bit_6 &~ basis_bits.bit_7)
44        temp6 = (temp4 & temp5)
45        lex.n = (temp3 & temp6)
46        temp7 = (basis_bits.bit_5 &~ basis_bits.bit_4)
47        temp8 = (basis_bits.bit_7 &~ basis_bits.bit_6)
48        temp9 = (temp7 & temp8)
49        lex.e = (temp3 & temp9)
50        temp10 = (basis_bits.bit_6 | basis_bits.bit_7)
51        temp11 = (temp7 &~ temp10)
52        lex.d = (temp3 & temp11)
53        temp12 = (temp4 &~ temp10)
54        lex.l = (temp3 & temp12)
55
56def Match(lex, matches):
57        m0 = lex.n
58        m1 = pablo.Advance(m0) & lex.e
59        m2 = pablo.Advance(m1) & lex.e
60        m3 = pablo.Advance(m2) & lex.d
61        m4 = pablo.Advance(m3) & lex.l
62        m5 = pablo.Advance(m4) & lex.e
63        matches.all = m5
64
65def CountMatches(lex, matches):
66        return pablo.PopCount(matches)
67
68basis_bits      = Basis_bits()
69lex           = Lex()
70matches     = Matches()
71
72if __name__ == "__main__":
73
74        option_parser = needle_demo_config.get_option_parser() 
75        options, args = option_parser.parse_args(sys.argv[1:])
76
77        if len(args) != 1:
78                option_parser.print_usage()
79                sys.exit()
80        else:
81                input_file = args[0]
82
83  # ReadStreamInput(data)
84        global data
85        data = bitutil.readfile(input_file)
86 
87        global lgth
88        lgth = len(data)
89
90        pablo.EOF_mask = pablo.transpose_streams(data, basis_bits)
91        ClassifyBytes(basis_bits, lex)
92        Match(lex, matches)
93
94  # WriteStreamOutput(Output)
95
96        if(options.count):
97          print str(CountMatches(lex, matches.all))
98        else:
99          lgth = len(data)
100          print "source data:             " + data
101          print "basis_bits.bit_7                 " + bitutil.bitstream2string(basis_bits.bit_7, lgth)
102          print "basis_bits.bit_6                 " + bitutil.bitstream2string(basis_bits.bit_6, lgth)
103          print "basis_bits.bit_5                 " + bitutil.bitstream2string(basis_bits.bit_5, lgth)
104          print "basis_bits.bit_4                 " + bitutil.bitstream2string(basis_bits.bit_4, lgth)
105          print "basis_bits.bit_3                 " + bitutil.bitstream2string(basis_bits.bit_3, lgth)
106          print "basis_bits.bit_2                 " + bitutil.bitstream2string(basis_bits.bit_2, lgth)
107          print "basis_bits.bit_1                 " + bitutil.bitstream2string(basis_bits.bit_1, lgth)
108          print "basis_bits.bit_0                 " + bitutil.bitstream2string(basis_bits.bit_0, lgth)
109
110          print "lex.n                            " + bitutil.bitstream2string(lex.n, lgth)
111          print "lex.e                            " + bitutil.bitstream2string(lex.e, lgth)
112          print "lex.e                            " + bitutil.bitstream2string(lex.e, lgth)
113          print "lex.d                            " + bitutil.bitstream2string(lex.d, lgth)
114          print "lex.l                            " + bitutil.bitstream2string(lex.l, lgth)
115          print "lex.e                            " + bitutil.bitstream2string(lex.e, lgth)
116          print "matches.all                      " + bitutil.bitstream2string(matches.all, lgth)
117               
118       
119
120
Note: See TracBrowser for help on using the repository browser.