From f5e042796217b7507e0cea34f627b3163b19b4b4 Mon Sep 17 00:00:00 2001
From: Oscar Gustafsson <oscar.gustafsson@gmail.com>
Date: Thu, 11 May 2023 11:42:24 +0200
Subject: [PATCH] Fix VHDL code imports and some spelling

---
 b_asic/codegen/__init__.py          |   0
 b_asic/codegen/vhdl/__init__.py     |   6 +-
 b_asic/codegen/vhdl/architecture.py | 218 ++++++++++++++--------------
 b_asic/codegen/vhdl/common.py       |  58 ++++----
 b_asic/codegen/vhdl/entity.py       |   7 +-
 b_asic/quantization.py              |   2 +-
 b_asic/resources.py                 |  10 +-
 7 files changed, 146 insertions(+), 155 deletions(-)
 create mode 100644 b_asic/codegen/__init__.py

diff --git a/b_asic/codegen/__init__.py b/b_asic/codegen/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/b_asic/codegen/vhdl/__init__.py b/b_asic/codegen/vhdl/__init__.py
index 5d6625b4..fc42a54f 100644
--- a/b_asic/codegen/vhdl/__init__.py
+++ b/b_asic/codegen/vhdl/__init__.py
@@ -21,7 +21,7 @@ def write(
     Base VHDL code generation utility.
 
     `f'{VHDL_TAB*indent_level}'` is first written to the :class:`io.TextIOWrapper`
-    object `f`. Immediatly after the indentation, `text` is written to `f`. Finally,
+    object `f`. Immediately after the indentation, `text` is written to `f`. Finally,
     `text` is also written to `f`.
 
     Parameters
@@ -64,8 +64,8 @@ def write_lines(
     """
     for tpl in lines:
         if len(tpl) == 2:
-            write(f, indent_level=tpl[0], text=tpl[1])
+            write(f, indent_level=tpl[0], text=str(tpl[1]))
         elif len(tpl) == 3:
-            write(f, indent_level=tpl[0], text=tpl[1], end=tpl[2])
+            write(f, indent_level=tpl[0], text=str(tpl[1]), end=str(tpl[2]))
         else:
             raise ValueError('All tuples in list `lines` must have length 2 or 3')
diff --git a/b_asic/codegen/vhdl/architecture.py b/b_asic/codegen/vhdl/architecture.py
index 918718cd..463f21b3 100644
--- a/b_asic/codegen/vhdl/architecture.py
+++ b/b_asic/codegen/vhdl/architecture.py
@@ -4,7 +4,7 @@ Module for code generation of VHDL architectures.
 from io import TextIOWrapper
 from typing import TYPE_CHECKING, Dict, Iterable, Set, Tuple, cast
 
-from b_asic.codegen import vhdl
+from b_asic.codegen.vhdl import common, write, write_lines
 from b_asic.process import MemoryVariable, PlainMemoryVariable
 
 if TYPE_CHECKING:
@@ -52,27 +52,25 @@ def memory_based_storage(
     # Code settings
     mem_depth = len(assignment)
     architecture_name = "rtl"
-    schedule_time = next(iter(assignment))._schedule_time
+    schedule_time = next(iter(assignment)).schedule_time
 
     # Write architecture header
-    vhdl.write(
-        f, 0, f'architecture {architecture_name} of {entity_name} is', end='\n\n'
-    )
+    write(f, 0, f'architecture {architecture_name} of {entity_name} is', end='\n\n')
 
     #
     # Architecture declerative region begin
     #
-    vhdl.write(f, 1, '-- HDL memory description')
-    vhdl.common.constant_declaration(
+    write(f, 1, '-- HDL memory description')
+    common.constant_declaration(
         f, name='MEM_WL', signal_type='integer', value=word_length, name_pad=12
     )
-    vhdl.common.constant_declaration(
+    common.constant_declaration(
         f, name='MEM_DEPTH', signal_type='integer', value=mem_depth, name_pad=12
     )
-    vhdl.common.type_declaration(
+    common.type_declaration(
         f, 'mem_type', 'array(0 to MEM_DEPTH-1) of std_logic_vector(MEM_WL-1 downto 0)'
     )
-    vhdl.common.signal_decl(
+    common.signal_decl(
         f,
         name='memory',
         signal_type='mem_type',
@@ -80,25 +78,25 @@ def memory_based_storage(
         vivado_ram_style='distributed',
     )
     for i in range(read_ports):
-        vhdl.common.signal_decl(
+        common.signal_decl(
             f, f'read_port_{i}', 'std_logic_vector(MEM_WL-1 downto 0)', name_pad=14
         )
-        vhdl.common.signal_decl(
+        common.signal_decl(
             f, f'read_adr_{i}', f'integer range 0 to {schedule_time}-1', name_pad=14
         )
-        vhdl.common.signal_decl(f, f'read_en_{i}', 'std_logic', name_pad=14)
+        common.signal_decl(f, f'read_en_{i}', 'std_logic', name_pad=14)
     for i in range(write_ports):
-        vhdl.common.signal_decl(
+        common.signal_decl(
             f, f'write_port_{i}', 'std_logic_vector(MEM_WL-1 downto 0)', name_pad=14
         )
-        vhdl.common.signal_decl(
+        common.signal_decl(
             f, f'write_adr_{i}', f'integer range 0 to {schedule_time}-1', name_pad=14
         )
-        vhdl.common.signal_decl(f, f'write_en_{i}', 'std_logic', name_pad=14)
+        common.signal_decl(f, f'write_en_{i}', 'std_logic', name_pad=14)
 
     # Schedule time counter
-    vhdl.write(f, 1, '-- Schedule counter', start='\n')
-    vhdl.common.signal_decl(
+    write(f, 1, '-- Schedule counter', start='\n')
+    common.signal_decl(
         f,
         name='schedule_cnt',
         signal_type=f'integer range 0 to {schedule_time}-1',
@@ -107,23 +105,23 @@ def memory_based_storage(
 
     # Input sync signals
     if input_sync:
-        vhdl.write(f, 1, '-- Input synchronization', start='\n')
+        write(f, 1, '-- Input synchronization', start='\n')
         for i in range(read_ports):
-            vhdl.common.signal_decl(
+            common.signal_decl(
                 f, f'p_{i}_in_sync', 'std_logic_vector(WL-1 downto 0)', name_pad=14
             )
 
     #
     # Architecture body begin
     #
-    vhdl.write(f, 0, 'begin', start='\n', end='\n\n')
-    vhdl.write(f, 1, '-- Schedule counter')
-    vhdl.common.synchronous_process_prologue(
+    write(f, 0, 'begin', start='\n', end='\n\n')
+    write(f, 1, '-- Schedule counter')
+    common.synchronous_process_prologue(
         f=f,
         name='schedule_cnt_proc',
         clk='clk',
     )
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (3, 'if rst = \'1\' then'),
@@ -139,30 +137,30 @@ def memory_based_storage(
             (3, 'end if;'),
         ],
     )
-    vhdl.common.synchronous_process_epilogue(
+    common.synchronous_process_epilogue(
         f=f,
         name='schedule_cnt_proc',
         clk='clk',
     )
 
     if input_sync:
-        vhdl.write(f, 1, '-- Input synchronization', start='\n')
-        vhdl.common.synchronous_process_prologue(
+        write(f, 1, '-- Input synchronization', start='\n')
+        common.synchronous_process_prologue(
             f=f,
             name='input_sync_proc',
             clk='clk',
         )
         for i in range(read_ports):
-            vhdl.write(f, 3, f'p_{i}_in_sync <= p_{i}_in;')
-        vhdl.common.synchronous_process_epilogue(
+            write(f, 3, f'p_{i}_in_sync <= p_{i}_in;')
+        common.synchronous_process_epilogue(
             f=f,
             name='input_sync_proc',
             clk='clk',
         )
 
     # Infer memory
-    vhdl.write(f, 1, '-- Memory', start='\n')
-    vhdl.common.asynchronous_read_memory(
+    write(f, 1, '-- Memory', start='\n')
+    common.asynchronous_read_memory(
         f=f,
         clk='clk',
         name=f'mem_{0}_proc',
@@ -177,21 +175,19 @@ def memory_based_storage(
     )
 
     # Write address generation
-    vhdl.write(f, 1, '-- Memory write address generation', start='\n')
+    write(f, 1, '-- Memory write address generation', start='\n')
     if input_sync:
-        vhdl.common.synchronous_process_prologue(
-            f, clk="clk", name="mem_write_address_proc"
-        )
+        common.synchronous_process_prologue(f, clk="clk", name="mem_write_address_proc")
     else:
-        vhdl.common.process_prologue(
+        common.process_prologue(
             f, sensitivity_list="schedule_cnt", name="mem_write_address_proc"
         )
-    vhdl.write(f, 3, 'case schedule_cnt is')
+    write(f, 3, 'case schedule_cnt is')
     for i, collection in enumerate(assignment):
         for mv in collection:
             mv = cast(MemoryVariable, mv)
             if mv.execution_time:
-                vhdl.write_lines(
+                write_lines(
                     f,
                     [
                         (4, f'-- {mv!r}'),
@@ -200,7 +196,7 @@ def memory_based_storage(
                         (5, 'write_en_0 <= \'1\';'),
                     ],
                 )
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (4, 'when others =>'),
@@ -210,38 +206,36 @@ def memory_based_storage(
         ],
     )
     if input_sync:
-        vhdl.common.synchronous_process_epilogue(
-            f, clk="clk", name="mem_write_address_proc"
-        )
+        common.synchronous_process_epilogue(f, clk="clk", name="mem_write_address_proc")
     else:
-        vhdl.common.process_epilogue(
+        common.process_epilogue(
             f, sensitivity_list="clk", name="mem_write_address_proc"
         )
 
     # Read address generation
-    vhdl.write(f, 1, '-- Memory read address generation', start='\n')
-    vhdl.common.synchronous_process_prologue(f, clk="clk", name="mem_read_address_proc")
-    vhdl.write(f, 3, 'case schedule_cnt is')
+    write(f, 1, '-- Memory read address generation', start='\n')
+    common.synchronous_process_prologue(f, clk="clk", name="mem_read_address_proc")
+    write(f, 3, 'case schedule_cnt is')
     for i, collection in enumerate(assignment):
         for mv in collection:
             mv = cast(PlainMemoryVariable, mv)
-            vhdl.write(f, 4, f'-- {mv!r}')
+            write(f, 4, f'-- {mv!r}')
             for read_time in mv.reads.values():
-                vhdl.write(
+                write(
                     f,
                     4,
                     'when'
                     f' {(mv.start_time+read_time-int(not(input_sync))) % schedule_time}'
                     ' =>',
                 )
-                vhdl.write_lines(
+                write_lines(
                     f,
                     [
                         (5, f'read_adr_0 <= {i};'),
                         (5, 'read_en_0 <= \'1\';'),
                     ],
                 )
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (4, 'when others =>'),
@@ -250,42 +244,42 @@ def memory_based_storage(
             (3, 'end case;'),
         ],
     )
-    vhdl.common.synchronous_process_epilogue(f, clk="clk", name="mem_read_address_proc")
+    common.synchronous_process_epilogue(f, clk="clk", name="mem_read_address_proc")
 
-    vhdl.write(f, 1, '-- Input and output assignmentn', start='\n')
+    write(f, 1, '-- Input and output assignments', start='\n')
     if input_sync:
-        vhdl.write(f, 1, 'write_port_0 <= p_0_in_sync;')
+        write(f, 1, 'write_port_0 <= p_0_in_sync;')
     else:
-        vhdl.write(f, 1, 'write_port_0 <= p_0_in;')
+        write(f, 1, 'write_port_0 <= p_0_in;')
     p_zero_exec = filter(
         lambda p: p.execution_time == 0, (p for pc in assignment for p in pc)
     )
-    vhdl.common.synchronous_process_prologue(
+    common.synchronous_process_prologue(
         f,
         clk='clk',
         name='output_reg_proc',
     )
-    vhdl.write(f, 3, 'case schedule_cnt is')
+    write(f, 3, 'case schedule_cnt is')
     for p in p_zero_exec:
         if input_sync:
             write_time = (p.start_time + 1) % schedule_time
-            vhdl.write(f, 4, f'when {write_time} => p_0_out <= p_0_in_sync;')
+            write(f, 4, f'when {write_time} => p_0_out <= p_0_in_sync;')
         else:
             write_time = (p.start_time) % schedule_time
-            vhdl.write(f, 4, f'when {write_time} => p_0_out <= p_0_in;')
-    vhdl.write_lines(
+            write(f, 4, f'when {write_time} => p_0_out <= p_0_in;')
+    write_lines(
         f,
         [
             (4, 'when others => p_0_out <= read_port_0;'),
             (3, 'end case;'),
         ],
     )
-    vhdl.common.synchronous_process_epilogue(
+    common.synchronous_process_epilogue(
         f,
         clk='clk',
         name='output_reg_proc',
     )
-    vhdl.write(f, 0, f'end architecture {architecture_name};', start='\n')
+    write(f, 0, f'end architecture {architecture_name};', start='\n')
 
 
 def register_based_storage(
@@ -325,16 +319,14 @@ def register_based_storage(
     }
 
     #
-    # Architecture declerative region begin
+    # Architecture declarative region begin
     #
     # Write architecture header
-    vhdl.write(
-        f, 0, f'architecture {architecture_name} of {entity_name} is', end='\n\n'
-    )
+    write(f, 0, f'architecture {architecture_name} of {entity_name} is', end='\n\n')
 
     # Schedule time counter
-    vhdl.write(f, 1, '-- Schedule counter')
-    vhdl.common.signal_decl(
+    write(f, 1, '-- Schedule counter')
+    common.signal_decl(
         f,
         name='schedule_cnt',
         signal_type=f'integer range 0 to {schedule_time}-1',
@@ -343,13 +335,13 @@ def register_based_storage(
     )
 
     # Shift register
-    vhdl.write(f, 1, '-- Shift register', start='\n')
-    vhdl.common.type_declaration(
+    write(f, 1, '-- Shift register', start='\n')
+    common.type_declaration(
         f,
         name='shift_reg_type',
         alias=f'array(0 to {reg_cnt}-1) of std_logic_vector(WL-1 downto 0)',
     )
-    vhdl.common.signal_decl(
+    common.signal_decl(
         f,
         name='shift_reg',
         signal_type='shift_reg_type',
@@ -357,8 +349,8 @@ def register_based_storage(
     )
 
     # Back edge mux decoder
-    vhdl.write(f, 1, '-- Back-edge mux select signal', start='\n')
-    vhdl.common.signal_decl(
+    write(f, 1, '-- Back-edge mux select signal', start='\n')
+    common.signal_decl(
         f,
         name='back_edge_mux_sel',
         signal_type=f'integer range 0 to {len(back_edges)}',
@@ -366,8 +358,8 @@ def register_based_storage(
     )
 
     # Output mux selector
-    vhdl.write(f, 1, '-- Output mux select signal', start='\n')
-    vhdl.common.signal_decl(
+    write(f, 1, '-- Output mux select signal', start='\n')
+    common.signal_decl(
         f,
         name='out_mux_sel',
         signal_type=f'integer range 0 to {len(output_regs) - 1}',
@@ -377,14 +369,14 @@ def register_based_storage(
     #
     # Architecture body begin
     #
-    vhdl.write(f, 0, 'begin', start='\n', end='\n\n')
-    vhdl.write(f, 1, '-- Schedule counter')
-    vhdl.common.synchronous_process_prologue(
+    write(f, 0, 'begin', start='\n', end='\n\n')
+    write(f, 1, '-- Schedule counter')
+    common.synchronous_process_prologue(
         f=f,
         name='schedule_cnt_proc',
         clk='clk',
     )
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (4, 'if en = \'1\' then'),
@@ -396,26 +388,26 @@ def register_based_storage(
             (4, 'end if;'),
         ],
     )
-    vhdl.common.synchronous_process_epilogue(
+    common.synchronous_process_epilogue(
         f=f,
         name='schedule_cnt_proc',
         clk='clk',
     )
 
     # Shift register back-edge decoding
-    vhdl.write(f, 1, '-- Shift register back-edge decoding', start='\n')
-    vhdl.common.synchronous_process_prologue(
+    write(f, 1, '-- Shift register back-edge decoding', start='\n')
+    common.synchronous_process_prologue(
         f,
         clk='clk',
         name='shift_reg_back_edge_decode_proc',
     )
-    vhdl.write(f, 3, 'case schedule_cnt is')
+    write(f, 3, 'case schedule_cnt is')
     for time, entry in enumerate(forward_backward_table):
         if entry.back_edge_to:
             assert len(entry.back_edge_to) == 1
             for src, dst in entry.back_edge_to.items():
                 mux_idx = back_edge_table[(src, dst)]
-                vhdl.write_lines(
+                write_lines(
                     f,
                     [
                         (4, f'when {(time-1)%schedule_time} =>'),
@@ -423,7 +415,7 @@ def register_based_storage(
                         (5, f'back_edge_mux_sel <= {mux_idx};'),
                     ],
                 )
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (4, 'when others =>'),
@@ -431,26 +423,26 @@ def register_based_storage(
             (3, 'end case;'),
         ],
     )
-    vhdl.common.synchronous_process_epilogue(
+    common.synchronous_process_epilogue(
         f,
         clk='clk',
         name='shift_reg_back_edge_decode_proc',
     )
 
     # Shift register multiplexer logic
-    vhdl.write(f, 1, '-- Multiplexers for shift register', start='\n')
-    vhdl.common.synchronous_process_prologue(
+    write(f, 1, '-- Multiplexers for shift register', start='\n')
+    common.synchronous_process_prologue(
         f,
         clk='clk',
         name='shift_reg_proc',
     )
     if sync_rst:
-        vhdl.write(f, 3, 'if rst = \'1\' then')
+        write(f, 3, 'if rst = \'1\' then')
         for reg_idx in range(reg_cnt):
-            vhdl.write(f, 4, f'shift_reg({reg_idx}) <= (others => \'0\');')
-        vhdl.write(f, 3, 'else')
+            write(f, 4, f'shift_reg({reg_idx}) <= (others => \'0\');')
+        write(f, 3, 'else')
 
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (3, '-- Default case'),
@@ -458,17 +450,17 @@ def register_based_storage(
         ],
     )
     for reg_idx in range(1, reg_cnt):
-        vhdl.write(f, 3, f'shift_reg({reg_idx}) <= shift_reg({reg_idx-1});')
-    vhdl.write(f, 3, 'case back_edge_mux_sel is')
+        write(f, 3, f'shift_reg({reg_idx}) <= shift_reg({reg_idx-1});')
+    write(f, 3, 'case back_edge_mux_sel is')
     for edge, mux_sel in back_edge_table.items():
-        vhdl.write_lines(
+        write_lines(
             f,
             [
                 (4, f'when {mux_sel} =>'),
                 (5, f'shift_reg({edge[1]}) <= shift_reg({edge[0]});'),
             ],
         )
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (4, 'when others => null;'),
@@ -477,45 +469,45 @@ def register_based_storage(
     )
 
     if sync_rst:
-        vhdl.write(f, 3, 'end if;')
+        write(f, 3, 'end if;')
 
-    vhdl.common.synchronous_process_epilogue(
+    common.synchronous_process_epilogue(
         f,
         clk='clk',
         name='shift_reg_proc',
     )
 
     # Output multiplexer decoding logic
-    vhdl.write(f, 1, '-- Output muliplexer decoding logic', start='\n')
-    vhdl.common.synchronous_process_prologue(f, clk='clk', name='out_mux_decode_proc')
-    vhdl.write(f, 3, 'case schedule_cnt is')
+    write(f, 1, '-- Output muliplexer decoding logic', start='\n')
+    common.synchronous_process_prologue(f, clk='clk', name='out_mux_decode_proc')
+    write(f, 3, 'case schedule_cnt is')
     for i, entry in enumerate(forward_backward_table):
         if entry.outputs_from is not None:
             sel = output_mux_table[entry.outputs_from]
-            vhdl.write(f, 4, f'when {(i-1)%schedule_time} =>')
-            vhdl.write(f, 5, f'out_mux_sel <= {sel};')
-    vhdl.write(f, 3, 'end case;')
-    vhdl.common.synchronous_process_epilogue(f, clk='clk', name='out_mux_decode_proc')
+            write(f, 4, f'when {(i-1)%schedule_time} =>')
+            write(f, 5, f'out_mux_sel <= {sel};')
+    write(f, 3, 'end case;')
+    common.synchronous_process_epilogue(f, clk='clk', name='out_mux_decode_proc')
 
     # Output multiplexer logic
-    vhdl.write(f, 1, '-- Output muliplexer', start='\n')
-    vhdl.common.synchronous_process_prologue(
+    write(f, 1, '-- Output muliplexer', start='\n')
+    common.synchronous_process_prologue(
         f,
         clk='clk',
         name='out_mux_proc',
     )
-    vhdl.write(f, 3, 'case out_mux_sel is')
+    write(f, 3, 'case out_mux_sel is')
     for reg_i, mux_i in output_mux_table.items():
-        vhdl.write(f, 4, f'when {mux_i} =>')
+        write(f, 4, f'when {mux_i} =>')
         if reg_i < 0:
-            vhdl.write(f, 5, f'p_0_out <= p_{-1-reg_i}_in;')
+            write(f, 5, f'p_0_out <= p_{-1-reg_i}_in;')
         else:
-            vhdl.write(f, 5, f'p_0_out <= shift_reg({reg_i});')
-    vhdl.write(f, 3, 'end case;')
-    vhdl.common.synchronous_process_epilogue(
+            write(f, 5, f'p_0_out <= shift_reg({reg_i});')
+    write(f, 3, 'end case;')
+    common.synchronous_process_epilogue(
         f,
         clk='clk',
         name='out_mux_proc',
     )
 
-    vhdl.write(f, 0, f'end architecture {architecture_name};', start='\n')
+    write(f, 0, f'end architecture {architecture_name};', start='\n')
diff --git a/b_asic/codegen/vhdl/common.py b/b_asic/codegen/vhdl/common.py
index 1fc188b2..30b5980b 100644
--- a/b_asic/codegen/vhdl/common.py
+++ b/b_asic/codegen/vhdl/common.py
@@ -8,7 +8,7 @@ from io import TextIOWrapper
 from subprocess import PIPE, Popen
 from typing import Any, Optional, Set, Tuple
 
-from b_asic.codegen import vhdl
+from b_asic.codegen.vhdl import write, write_lines
 
 
 def b_asic_preamble(f: TextIOWrapper):
@@ -27,7 +27,7 @@ def b_asic_preamble(f: TextIOWrapper):
         git_commit_id = process.communicate()[0].decode('utf-8').strip()
     except:  # noqa: E722
         pass
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (0, '--'),
@@ -36,8 +36,8 @@ def b_asic_preamble(f: TextIOWrapper):
         ],
     )
     if git_commit_id:
-        vhdl.write(f, 0, f'-- B-ASIC short commit hash: {git_commit_id}')
-    vhdl.write_lines(
+        write(f, 0, f'-- B-ASIC short commit hash: {git_commit_id}')
+    write_lines(
         f,
         [
             (0, '-- URL: https://gitlab.liu.se/da/B-ASIC'),
@@ -64,12 +64,12 @@ def ieee_header(
     numeric_std : bool, default: True
         Include the numeric_std header.
     """
-    vhdl.write(f, 0, 'library ieee;')
+    write(f, 0, 'library ieee;')
     if std_logic_1164:
-        vhdl.write(f, 0, 'use ieee.std_logic_1164.all;')
+        write(f, 0, 'use ieee.std_logic_1164.all;')
     if numeric_std:
-        vhdl.write(f, 0, 'use ieee.numeric_std.all;')
-    vhdl.write(f, 0, '')
+        write(f, 0, 'use ieee.numeric_std.all;')
+    write(f, 0, '')
 
 
 def signal_decl(
@@ -109,12 +109,12 @@ def signal_decl(
     """
     # Spacing of VHDL signals declaration always with a single tab
     name_pad = name_pad or 0
-    vhdl.write(f, 1, f'signal {name:<{name_pad}} : {signal_type}', end='')
+    write(f, 1, f'signal {name:<{name_pad}} : {signal_type}', end='')
     if default_value is not None:
-        vhdl.write(f, 0, f' := {default_value}', end='')
-    vhdl.write(f, 0, ';')
+        write(f, 0, f' := {default_value}', end='')
+    write(f, 0, ';')
     if vivado_ram_style is not None:
-        vhdl.write_lines(
+        write_lines(
             f,
             [
                 (1, 'attribute ram_style : string;'),
@@ -122,7 +122,7 @@ def signal_decl(
             ],
         )
     if quartus_ram_style is not None:
-        vhdl.write_lines(
+        write_lines(
             f,
             [
                 (1, 'attribute ramstyle : string;'),
@@ -156,7 +156,7 @@ def constant_declaration(
         An optional left padding value applied to the name.
     """
     name_pad = 0 if name_pad is None else name_pad
-    vhdl.write(f, 1, f'constant {name:<{name_pad}} : {signal_type} := {str(value)};')
+    write(f, 1, f'constant {name:<{name_pad}} : {signal_type} := {str(value)};')
 
 
 def type_declaration(
@@ -176,7 +176,7 @@ def type_declaration(
     alias : str
         The type to tie the new name to.
     """
-    vhdl.write(f, 1, f'type {name} is {alias};')
+    write(f, 1, f'type {name} is {alias};')
 
 
 def process_prologue(
@@ -202,10 +202,10 @@ def process_prologue(
         An optional name for the process.
     """
     if name is not None:
-        vhdl.write(f, indent, f'{name}: process({sensitivity_list})')
+        write(f, indent, f'{name}: process({sensitivity_list})')
     else:
-        vhdl.write(f, indent, f'process({sensitivity_list})')
-    vhdl.write(f, indent, 'begin')
+        write(f, indent, f'process({sensitivity_list})')
+    write(f, indent, 'begin')
 
 
 def process_epilogue(
@@ -229,10 +229,10 @@ def process_epilogue(
         An optional name of the ending process.
     """
     _ = sensitivity_list
-    vhdl.write(f, indent, 'end process', end="")
+    write(f, indent, 'end process', end="")
     if name is not None:
-        vhdl.write(f, 0, ' ' + name, end="")
-    vhdl.write(f, 0, ';')
+        write(f, 0, ' ' + name, end="")
+    write(f, 0, ';')
 
 
 def synchronous_process_prologue(
@@ -261,7 +261,7 @@ def synchronous_process_prologue(
         An optional name for the process.
     """
     process_prologue(f, sensitivity_list=clk, indent=indent, name=name)
-    vhdl.write(f, indent + 1, 'if rising_edge(clk) then')
+    write(f, indent + 1, 'if rising_edge(clk) then')
 
 
 def synchronous_process_epilogue(
@@ -288,7 +288,7 @@ def synchronous_process_epilogue(
         An optional name for the process
     """
     _ = clk
-    vhdl.write(f, indent + 1, 'end if;')
+    write(f, indent + 1, 'end if;')
     process_epilogue(f, sensitivity_list=clk, indent=indent, name=name)
 
 
@@ -321,7 +321,7 @@ def synchronous_process(
     synchronous_process_prologue(f, clk, indent, name)
     for line in body.split('\n'):
         if len(line):
-            vhdl.write(f, indent + 2, f'{line}')
+            write(f, indent + 2, f'{line}')
     synchronous_process_epilogue(f, clk, indent, name)
 
 
@@ -352,7 +352,7 @@ def synchronous_memory(
     assert len(write_ports) >= 1
     synchronous_process_prologue(f, clk=clk, name=name)
     for read_name, address, read_enable in read_ports:
-        vhdl.write_lines(
+        write_lines(
             f,
             [
                 (3, f'if {read_enable} = \'1\' then'),
@@ -361,7 +361,7 @@ def synchronous_memory(
             ],
         )
     for write_name, address, we in write_ports:
-        vhdl.write_lines(
+        write_lines(
             f,
             [
                 (3, f'if {we} = \'1\' then'),
@@ -399,7 +399,7 @@ def asynchronous_read_memory(
     assert len(write_ports) >= 1
     synchronous_process_prologue(f, clk=clk, name=name)
     for write_name, address, we in write_ports:
-        vhdl.write_lines(
+        write_lines(
             f,
             [
                 (3, f'if {we} = \'1\' then'),
@@ -409,14 +409,14 @@ def asynchronous_read_memory(
         )
     synchronous_process_epilogue(f, clk=clk, name=name)
     for read_name, address, _ in read_ports:
-        vhdl.write(f, 1, f'{read_name} <= memory({address});')
+        write(f, 1, f'{read_name} <= memory({address});')
 
 
 def is_valid_vhdl_identifier(identifier: str) -> bool:
     """
     Test if identifier is a valid VHDL identifier, as specified by VHDL 2019.
 
-    An indentifier is a valid VHDL identifier if it is not a VHDL reserved keyword and
+    An identifier is a valid VHDL identifier if it is not a VHDL reserved keyword and
     it is a valid basic identifier as specified by IEEE STD 1076-2019 (VHDL standard).
 
     Parameters
diff --git a/b_asic/codegen/vhdl/entity.py b/b_asic/codegen/vhdl/entity.py
index 9673baac..60c24750 100644
--- a/b_asic/codegen/vhdl/entity.py
+++ b/b_asic/codegen/vhdl/entity.py
@@ -4,8 +4,7 @@ Module for code generation of VHDL entity declarations
 from io import TextIOWrapper
 from typing import Set
 
-from b_asic.codegen import vhdl
-from b_asic.codegen.vhdl import VHDL_TAB
+from b_asic.codegen.vhdl import VHDL_TAB, write_lines
 from b_asic.port import Port
 from b_asic.process import MemoryVariable, PlainMemoryVariable
 from b_asic.resources import ProcessCollection
@@ -29,7 +28,7 @@ def memory_based_storage(
     entity_name = entity_name
 
     # Write the entity header
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (0, f'entity {entity_name} is'),
@@ -42,7 +41,7 @@ def memory_based_storage(
     )
 
     # Write the clock and reset signal
-    vhdl.write_lines(
+    write_lines(
         f,
         [
             (0, '-- Clock, synchronous reset and enable signals'),
diff --git a/b_asic/quantization.py b/b_asic/quantization.py
index e491bca3..2e70ad4c 100644
--- a/b_asic/quantization.py
+++ b/b_asic/quantization.py
@@ -33,7 +33,7 @@ class Overflow(Enum):
 
     SATURATION = 2
     """
-    Two's complement saturation, i.e., overflow return the most postive/negative
+    Two's complement saturation, i.e., overflow return the most positive/negative
     number.
     """
 
diff --git a/b_asic/resources.py b/b_asic/resources.py
index 4dbf57e1..2eb3562d 100644
--- a/b_asic/resources.py
+++ b/b_asic/resources.py
@@ -1282,14 +1282,14 @@ class ProcessCollection:
         forward_backward_table = _ForwardBackwardTable(self)
 
         with open(filename, 'w') as f:
-            from b_asic.codegen import vhdl
+            from b_asic.codegen.vhdl import architecture, common, entity
 
-            vhdl.common.b_asic_preamble(f)
-            vhdl.common.ieee_header(f)
-            vhdl.entity.register_based_storage(
+            common.b_asic_preamble(f)
+            common.ieee_header(f)
+            entity.register_based_storage(
                 f, entity_name=entity_name, collection=self, word_length=word_length
             )
-            vhdl.architecture.register_based_storage(
+            architecture.register_based_storage(
                 f,
                 forward_backward_table=forward_backward_table,
                 entity_name=entity_name,
-- 
GitLab