Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -708,12 +708,15 @@ def _insert_latency_cnop_if_needed(self, bundle: int, prev_kernel: KernelInfo, l
# First ifetch, account for last xinst latency
last_xq_lat = 0
x_idx = len(prev_kernel.xinstrs) - 1
prev_bundle = prev_kernel.xinstrs[x_idx].bundle
while (
x_idx >= 0 and prev_kernel.xinstrs[x_idx].bundle == prev_bundle and not isinstance(prev_kernel.xinstrs[x_idx], xinst.XStore)
):
last_xq_lat += get_instruction_lat(prev_kernel.xinstrs[x_idx])
x_idx -= 1
if x_idx >= 0:
prev_bundle = prev_kernel.xinstrs[x_idx].bundle
while (
x_idx >= 0
and prev_kernel.xinstrs[x_idx].bundle == prev_bundle
and not isinstance(prev_kernel.xinstrs[x_idx], xinst.XStore)
):
last_xq_lat += get_instruction_lat(prev_kernel.xinstrs[x_idx])
x_idx -= 1

# Adjust cycles if last xinst bundle latency is greater than last CQueue throughput
if last_cq_tp < last_xq_lat:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
import pytest
from linker.instructions.cinst import CLoad, CStore
from linker.instructions.minst import MLoad, MStore
from linker.kern_trace.kern_remap import remap_cinstrs_vars_hbm, remap_dinstrs_vars, remap_m_c_instrs_vars
from linker.instructions.xinst import Mac
from linker.kern_trace.kern_remap import remap_cinstrs_vars_hbm, remap_dinstrs_vars, remap_m_c_instrs_vars, remap_xinstrs_vars
from linker.kern_trace.kern_var import KernVar
from linker.kern_trace.kernel_op import KernelOp

Expand Down Expand Up @@ -353,3 +354,306 @@ def test_invalid_var_name(self):
# Assert
assert mock_instr.var_name == "0" # Unchanged
assert mock_instr.comment == "Store new_dest"


class TestRemapCinstrsVarsHbm:
"""
@class TestRemapCinstrsVarsHbm
@brief Test cases for the remap_cinstrs_vars_hbm function
"""

def _create_remap_dict(self):
"""
@brief Helper method to create a remap dictionary
"""
return {"old_var": "new_var", "input_data": "remapped_input"}

def test_remap_cload_comment(self):
"""
@brief Test remapping variables in CLoad instruction comments
"""
# Arrange
mock_instr = MagicMock(spec=CLoad)
mock_instr.comment = "Load from old_var"

kernel_instrs = [mock_instr]
hbm_remap_dict = self._create_remap_dict()

# Act
remap_cinstrs_vars_hbm(kernel_instrs, hbm_remap_dict)

# Assert
assert mock_instr.comment == "Load from new_var"

def test_remap_cstore_comment(self):
"""
@brief Test remapping variables in CStore instruction comments
"""
# Arrange
mock_instr = MagicMock(spec=CStore)
mock_instr.comment = "Store to input_data buffer"

kernel_instrs = [mock_instr]
hbm_remap_dict = self._create_remap_dict()

# Act
remap_cinstrs_vars_hbm(kernel_instrs, hbm_remap_dict)

# Assert
assert mock_instr.comment == "Store to remapped_input buffer"

def test_remap_after_first_match(self):
"""
@brief Test that remapping even after first match (break statement)
"""
# Arrange
mock_instr = MagicMock(spec=CLoad)
mock_instr.comment = "old_var and old_var again"

kernel_instrs = [mock_instr]
# Dict with multiple keys that could match
hbm_remap_dict = {"old_var": "new_var", "again": "never"}

# Act
remap_cinstrs_vars_hbm(kernel_instrs, hbm_remap_dict)

# Assert
# Only first match should be replaced due to break
assert mock_instr.comment == "new_var and new_var again"
assert "never" not in mock_instr.comment

def test_skip_unmapped_variables(self):
"""
@brief Test that variables not in remap dict are unchanged
"""
# Arrange
mock_instr = MagicMock(spec=CLoad)
mock_instr.comment = "Load unmapped_var"

kernel_instrs = [mock_instr]
hbm_remap_dict = self._create_remap_dict()

# Act
remap_cinstrs_vars_hbm(kernel_instrs, hbm_remap_dict)

# Assert
assert mock_instr.comment == "Load unmapped_var" # Unchanged

def test_empty_remap_dict(self):
"""
@brief Test with empty remap dictionary
"""
# Arrange
mock_instr = MagicMock(spec=CStore)
mock_instr.comment = "Original comment"

kernel_instrs = [mock_instr]
hbm_remap_dict = {}

# Act
remap_cinstrs_vars_hbm(kernel_instrs, hbm_remap_dict)

# Assert
assert mock_instr.comment == "Original comment"

def test_invalid_instruction_type(self):
"""
@brief Test error when instruction is not a CInstruction
"""
# Arrange
mock_instr = MagicMock() # Not a CInstruction

kernel_instrs = [mock_instr]
hbm_remap_dict = self._create_remap_dict()

# Act & Assert
with pytest.raises(TypeError, match="not a valid CInstruction"):
remap_cinstrs_vars_hbm(kernel_instrs, hbm_remap_dict)

def test_multiple_instructions(self):
"""
@brief Test remapping across multiple instructions
"""
# Arrange
mock_cload = MagicMock(spec=CLoad)
mock_cload.comment = "Load old_var"

mock_cstore = MagicMock(spec=CStore)
mock_cstore.comment = "Store input_data"

kernel_instrs = [mock_cload, mock_cstore]
hbm_remap_dict = self._create_remap_dict()

# Act
remap_cinstrs_vars_hbm(kernel_instrs, hbm_remap_dict)

# Assert
assert mock_cload.comment == "Load new_var"
assert mock_cstore.comment == "Store remapped_input"


class TestRemapXinstrsVars:
"""
@class TestRemapXinstrsVars
@brief Test cases for the remap_xinstrs_vars function
"""

def _create_remap_dict(self):
"""
@brief Helper method to create a remap dictionary
"""
return {"source_var": "remapped_source", "dest_var": "remapped_dest"}

def test_remap_move_instruction_comment(self):
"""
@brief Test remapping variables in Move instruction comments
"""
# Arrange
from linker.instructions.xinst import Move

mock_move = MagicMock(spec=Move)
mock_move.comment = "Move from source_var"

kernel_xinstrs = [mock_move]
hbm_remap_dict = self._create_remap_dict()

# Act
remap_xinstrs_vars(kernel_xinstrs, hbm_remap_dict)

# Assert
assert mock_move.comment == "Move from remapped_source"

def test_remap_xstore_instruction_comment(self):
"""
@brief Test remapping variables in XStore instruction comments
"""
# Arrange
from linker.instructions.xinst import XStore

mock_xstore = MagicMock(spec=XStore)
mock_xstore.comment = "Store to dest_var"

kernel_xinstrs = [mock_xstore]
hbm_remap_dict = self._create_remap_dict()

# Act
remap_xinstrs_vars(kernel_xinstrs, hbm_remap_dict)

# Assert
assert mock_xstore.comment == "Store to remapped_dest"

def test_remap_after_first_match(self):
"""
@brief Test that remapping even after first match (break statement)
"""
# Arrange
from linker.instructions.xinst import Move

mock_instr = MagicMock(spec=Move)
mock_instr.comment = "source_var and source_var repeated"

kernel_xinstrs = [mock_instr]
hbm_remap_dict = {"source_var": "new_src", "repeated": "never_used"}

# Act
remap_xinstrs_vars(kernel_xinstrs, hbm_remap_dict)

# Assert
# Only first match replaced due to break
assert mock_instr.comment == "new_src and new_src repeated"
assert "never_used" not in mock_instr.comment

def test_skip_unmapped_variables(self):
"""
@brief Test that unmapped variables remain unchanged
"""
# Arrange
from linker.instructions.xinst import Move

mock_instr = MagicMock(spec=Move)
mock_instr.comment = "Move unmapped_var"

kernel_xinstrs = [mock_instr]
hbm_remap_dict = self._create_remap_dict()

# Act
remap_xinstrs_vars(kernel_xinstrs, hbm_remap_dict)

# Assert
assert mock_instr.comment == "Move unmapped_var"

def test_empty_remap_dict(self):
"""
@brief Test with empty remap dictionary
"""
# Arrange
from linker.instructions.xinst import XStore

mock_instr = MagicMock(spec=XStore)
mock_instr.comment = "Original XStore comment"

kernel_xinstrs = [mock_instr]
hbm_remap_dict = {}

# Act
remap_xinstrs_vars(kernel_xinstrs, hbm_remap_dict)

# Assert
assert mock_instr.comment == "Original XStore comment"

def test_invalid_instruction_type(self):
"""
@brief Test error when instruction is not an XInstruction
"""
# Arrange
mock_instr = MagicMock() # Not an XInstruction

kernel_xinstrs = [mock_instr]
hbm_remap_dict = self._create_remap_dict()

# Act & Assert
with pytest.raises(TypeError, match="not a valid X Instruction"):
remap_xinstrs_vars(kernel_xinstrs, hbm_remap_dict)

def test_multiple_instructions(self):
"""
@brief Test remapping across multiple X instructions
"""
# Arrange
from linker.instructions.xinst import Move, XStore

mock_move = MagicMock(spec=Move)
mock_move.comment = "Move source_var"

mock_xstore = MagicMock(spec=XStore)
mock_xstore.comment = "Store dest_var"

kernel_xinstrs = [mock_move, mock_xstore]
hbm_remap_dict = self._create_remap_dict()

# Act
remap_xinstrs_vars(kernel_xinstrs, hbm_remap_dict)

# Assert
assert mock_move.comment == "Move remapped_source"
assert mock_xstore.comment == "Store remapped_dest"

def test_non_move_xstore_instructions_ignored(self):
"""
@brief Test that non-Move/XStore X instructions are not processed
"""
# Create a mock XInstruction that's not Move or XStore
mock_other = MagicMock(spec=Mac)
# Remove Move and XStore from isinstance check
type(mock_other).__name__ = "OtherXInst"
mock_other.comment = "source_var reference"

kernel_xinstrs = [mock_other]
hbm_remap_dict = self._create_remap_dict()

# Act
remap_xinstrs_vars(kernel_xinstrs, hbm_remap_dict)

# Assert
# Comment should be unchanged since it's not Move or XStore
assert mock_other.comment == "source_var reference"
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,44 @@ def test_level_property_immutability(self):
# Act & Assert
with pytest.raises(AttributeError):
kern_var.level = 1 # Should raise AttributeError for read-only property

def test_repr_representation(self):
"""
@brief Test __repr__ method if implemented
"""
# Arrange
kern_var = KernVar("var", 4096, 2)

# Act
result = repr(kern_var)

# Assert
assert isinstance(result, str)
assert len(result) > 0

def test_equality_between_identical_kern_vars(self):
"""
@brief Test equality comparison if __eq__ is implemented
"""
# Arrange
var1 = KernVar("test", 8192, 2)
var2 = KernVar("test", 8192, 2)

# Act & Assert
# Check if __eq__ is implemented by comparing
try:
assert var1 == var2 or (var1.label == var2.label and var1.degree == var2.degree and var1.level == var2.level)
except AssertionError:
# If __eq__ not implemented, identity comparison will fail
pass

def test_inequality_between_different_kern_vars(self):
"""
@brief Test inequality when labels differ
"""
# Arrange
var1 = KernVar("var1", 8192, 2)
var2 = KernVar("var2", 8192, 2)

# Act & Assert
assert var1 != var2 or var1.label != var2.label
Loading
Loading