import qubiter.utilities_gen as utg
[docs]class SEO_pre_reader:
"""
This class' constructor scans (pre-reads) an English file (a type of txt
file). It skips all lines except the ones starting with LOOP or NEXT. By
doing so, it collects information about LOOPs (where they start and end,
their id number and their number of reps). This class is inherited by
class SEO_reader which uses its information to handle embedded loops.
See docstring for class SEO_writer for more info about English files.
Attributes
----------
english_in : _io.TextIOWrapper
file object for input text file that stores English description of
circuit
file_prefix : str
beginning of the name of English file being scanned
loop_queue : list[int]
a queue of loops labelled by their id number
loop_to_nreps : dict[int, int]
a dictionary mapping loop number TO total number of repetitions of
loop
loop_to_start_line : dict[int, int]
a dictionary mapping loop number TO loop line + 1
loop_to_start_offset : dict[int, int]
a dictionary mapping loop number TO offset of loop's start
num_qbits : int
number of qubits in whole circuit
split_line : list[str]
storage space for a list of strings obtained by splitting a line
tot_num_lines : int
number of lines in English file
"""
[docs] def __init__(self, file_prefix, num_qbits):
"""
Constructor
Parameters
----------
file_prefix : str
file must be called file_prefix + '_' + num_qbits + "_eng.txt"
num_qbits : int
total number of qubits of circuit.
Returns
-------
"""
self.file_prefix = file_prefix
self.num_qbits = num_qbits
self.english_in = open(utg.preface(
file_prefix + '_' + str(num_qbits) + '_eng.txt'), 'rt')
self.split_line = None
self.tot_num_lines = 0
self.loop_to_start_offset = {}
self.loop_to_start_line = {}
self.loop_to_nreps = {}
self.loop_queue = []
while not self.english_in.closed:
self.scan_next_line()
[docs] def scan_next_line(self):
"""
Scans one line. Skips over any line that doesn't start with LOOP or
NEXT.
Parameters
----------
Returns
-------
None
"""
line = self.english_in.readline()
if not line or not line.strip():
self.english_in.close()
return
self.split_line = line.split()
line_name = self.split_line[0]
self.tot_num_lines += 1
if line_name == "LOOP":
self.scan_LOOP()
elif line_name == "NEXT":
self.scan_NEXT()
else:
pass
[docs] def scan_LOOP(self):
"""
Parses and uses line starting with "LOOP".
Returns
-------
None
"""
# example:
# LOOP 5 NREPS= 2
loop_num = int(self.split_line[1])
nreps = int(self.split_line[3])
# print(self.split_line)
assert loop_num not in self.loop_to_nreps.keys(),\
"this loop number has occurred before"
self.loop_to_start_offset[loop_num] = self.english_in.tell()
self.loop_to_start_line[loop_num] = self.tot_num_lines + 1
self.loop_to_nreps[loop_num] = nreps
self.loop_queue += [loop_num]
[docs] def scan_NEXT(self):
"""
Parses and uses line starting with "NEXT".
Returns
-------
None
"""
# example:
# NEXT 5
loop_num = int(self.split_line[1])
# print(self.split_line)
if not self.loop_queue:
assert False, "unmatched NEXT"
if loop_num == self.loop_queue[-1]:
del self.loop_queue[-1]
else:
assert False, "improperly nested loops"
if __name__ == "__main__":
def main():
print(5)
main()