source: proto/parabix2/bitutil.py @ 296

Last change on this file since 296 was 296, checked in by cameron, 10 years ago

Add filter_bits routine.

File size: 3.0 KB
Line 
1#
2# bitutil.py
3#
4# Bitstream Utilities
5#
6# These are quick-and-dirty Python implementations of utilities
7# for demo purposes only.
8#
9# Robert D. Cameron
10# August 19, 2009
11#
12#----------------------------------------------------------------------------
13#
14# We use python's unlimited precision integers for unbounded bit streams.
15# This permits simple logical operations on the entire stream.
16# Assumption: bitstreams are little-endian (e.g., as on x86).
17#
18#----------------------------------------------------------------------------
19#
20
21# Utility functions for demo purposes.
22#
23def readfile(filename):
24        f = open(filename)
25        contents = f.read()
26        f.close()
27        return contents
28
29def count_leading_zeroes(strm):
30        zeroes = 0
31        while (strm & 0xFFFFFFFF) == 0: 
32                zeroes += 32
33                strm >>= 32
34        while (strm & 1) == 0:
35                zeroes += 1
36                strm >>= 1
37        return zeroes
38       
39#
40def transpose_streams(s):
41        b = []
42        mask = 128
43        index = 0
44        while index < 8:
45                current = 0
46                cursor = 1
47                for c in s:
48                       
49                        if isinstance(c,str):
50                                val = ord(c)
51                        else:
52                                val = c
53                        if  (val & mask != 0):
54                                current += cursor
55                        cursor <<= 1
56                       
57                index+=1
58                mask>>=1
59                b.append(current)
60        return (b, cursor-1)  # basis streams and EOF mask
61
62def inverse_transpose(bitset, len):
63        bytestream=""
64        cursor = 1
65        for i in range(0, len):
66                byteval = 0
67                for j in range(0,8):
68                        if bitset[j] & cursor != 0:
69                                byteval += 128 >> j
70                bytestream += chr(byteval)
71                cursor += cursor
72        return bytestream
73                       
74def filter_bits(bitstream, delmask):
75        newstream = 0
76        cursor = 1
77        while delmask > 0:
78                if delmask & 1 == 0:
79                        if bitstream & 1 == 1:
80                                newstream += cursor
81                        cursor += cursor
82                delmask >>= 1
83                bitstream >>= 1
84        while bitstream > 0:
85                if bitstream & 1 == 1:
86                        newstream += cursor
87                cursor += cursor
88                bitstream >>= 1         
89        return newstream
90                       
91def filter_bytes(bytestream, delmask):
92        newstream=""
93        cursor = 1
94        for c in bytestream:
95                if delmask & cursor == 0:
96                        newstream += c
97                cursor += cursor
98        return newstream
99                       
100def merge_bytes(stream1, stream2):
101        s = ""
102        for i in range(len(stream1)):
103                s += stream1[i]
104                s += stream2[i]
105        return s
106
107def bitstream2string(stream, lgth):
108        str = ""
109        for i in range(lgth):
110                if stream & 1 == 1: str += '1'
111                else: str += '_'
112                stream >>= 1
113        return str
114
115def print_aligned_streams(stream_list):
116        """Print out a set of aligned streams."""
117        label_max = max([len(p[0]) for p in stream_list])
118        for p in stream_list:
119                print (p[0] + " "*(label_max - len(p[0]))) + ": " + p[1]
120
121
122def high_nybble_stream(bytes):
123        str=""
124        for b in bytes:
125                h = hex(ord(b))[-2]
126                if h == 'x': str += '0'
127                else: str += h
128        return str
129
130def low_nybble_stream(bytes):
131        str=""
132        for b in bytes:
133                str += hex(ord(b))[-1]
134        return str
135
136
137       
138#
139#  ScanThru is the core operation for parallel scanning.
140#  Give a bitstream Cursors marking current cursor positions,
141#  advance each cursor through occurrences of a character
142#  class identified by ScanStream.
143
144def ScanThru(Cursors, ScanStream):
145        return (Cursors + ScanStream) & ~ScanStream
146
147#
148# Advance all cursors by one position.
149def Advance(stream):
150        return stream + stream
151
Note: See TracBrowser for help on using the repository browser.