source: proto/parabix2/bitutil.py @ 277

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

New parabix2 prototype

File size: 2.7 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_bytes(bytestream, delmask):
75        newstream=""
76        cursor = 1
77        for c in bytestream:
78                if delmask & cursor == 0:
79                        newstream += c
80                cursor += cursor
81        return newstream
82                       
83def merge_bytes(stream1, stream2):
84        s = ""
85        for i in range(len(stream1)):
86                s += stream1[i]
87                s += stream2[i]
88        return s
89
90def bitstream2string(stream, lgth):
91        str = ""
92        for i in range(lgth):
93                if stream & 1 == 1: str += '1'
94                else: str += '_'
95                stream >>= 1
96        return str
97
98def print_aligned_streams(stream_list):
99        """Print out a set of aligned streams."""
100        label_max = max([len(p[0]) for p in stream_list])
101        for p in stream_list:
102                print (p[0] + " "*(label_max - len(p[0]))) + ": " + p[1]
103
104
105def high_nybble_stream(bytes):
106        str=""
107        for b in bytes:
108                h = hex(ord(b))[-2]
109                if h == 'x': str += '0'
110                else: str += h
111        return str
112
113def low_nybble_stream(bytes):
114        str=""
115        for b in bytes:
116                str += hex(ord(b))[-1]
117        return str
118
119
120       
121#
122#  ScanThru is the core operation for parallel scanning.
123#  Give a bitstream Cursors marking current cursor positions,
124#  advance each cursor through occurrences of a character
125#  class identified by ScanStream.
126
127def ScanThru(Cursors, ScanStream):
128        return (Cursors + ScanStream) & ~ScanStream
129
130#
131# Advance all cursors by one position.
132def Advance(stream):
133        return stream + stream
134
Note: See TracBrowser for help on using the repository browser.