Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
ef315a7
Added get_semiconductor_module_context_with_sites and scan for tsm_co…
prithierajmr Feb 18, 2026
2fff250
Update src/nitsm/tsmcontext.py
prithierajmr Mar 9, 2026
48cba71
Update src/nitsm/tsmcontext.py
prithierajmr Mar 9, 2026
51978c3
Update src/nitsm/tsmcontext.py
prithierajmr Mar 9, 2026
ffa316a
Used dumb dispatch for TSM context with Sites and Test for checking t…
prithierajmr Mar 12, 2026
78cc0ce
Revert "Used dumb dispatch for TSM context with Sites and Test for ch…
prithierajmr Mar 30, 2026
be9f63a
Revert "Update src/nitsm/tsmcontext.py "
prithierajmr Mar 30, 2026
3bec2bf
Revert "Update src/nitsm/tsmcontext.py "
prithierajmr Mar 30, 2026
b2e716b
Revert "Update src/nitsm/tsmcontext.py "
prithierajmr Mar 30, 2026
22e4c4a
Reapply "Update src/nitsm/tsmcontext.py "
prithierajmr Mar 30, 2026
6e82487
Reapply "Update src/nitsm/tsmcontext.py "
prithierajmr Mar 30, 2026
0bb839d
Reapply "Update src/nitsm/tsmcontext.py "
prithierajmr Mar 30, 2026
cf24d6f
Reapply "Used dumb dispatch for TSM context with Sites and Test for c…
prithierajmr Mar 30, 2026
73a5205
Revert "Used dumb dispatch for TSM context with Sites and Test for ch…
prithierajmr Mar 30, 2026
e9ca5ad
Revert "Update src/nitsm/tsmcontext.py "
prithierajmr Mar 30, 2026
e371832
Revert "Update src/nitsm/tsmcontext.py "
prithierajmr Mar 30, 2026
cfee7d5
Revert "Update src/nitsm/tsmcontext.py "
prithierajmr Mar 30, 2026
2193d92
Revert "Added get_semiconductor_module_context_with_sites and scan fo…
prithierajmr Mar 30, 2026
e717d23
Reverted all the changes done earlier. Updated tsmcontext.py file wit…
prithierajmr Mar 31, 2026
cc513cd
Reverted all the changes done earlier. Updated tsmcontext.py file wit…
prithierajmr Mar 31, 2026
f8eada4
Update src/nitsm/tsmcontext.py
prithierajmr Apr 1, 2026
46373f2
Update tests/test_multi_site.py
prithierajmr Apr 1, 2026
5eaf01e
Update tests/test_multi_site.py
prithierajmr Apr 1, 2026
0fec9a2
Update tests/test_multi_site.py
prithierajmr Apr 1, 2026
a0a1c32
Ran black formatter on tsmcontext.py and added few additional checks …
prithierajmr Apr 1, 2026
9c95a1c
Lint fix - ran black
prithierajmr Apr 6, 2026
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
19 changes: 19 additions & 0 deletions src/nitsm/tsmcontext.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""TSM Context Wrapper"""

import ctypes.wintypes
import time
import typing
Expand Down Expand Up @@ -208,6 +209,24 @@ def site_numbers(self) -> "_Tuple[int, ...]":
return self._context.SiteNumbers

# Site and Global Data
def get_semiconductor_module_context_with_sites(
self, site_numbers: "_Sequence[int]"
) -> "SemiconductorModuleContext":
"""Returns a Semiconductor Module context object which holds information and resources
specific to the site_numbers mentioned.

Args:
site_numbers: A sequence of site numbers for which the resources should be used.

Returns:
SemiconductorModuleContext object with resources specific to the site_numbers.
"""
tsm_dispatch = self._context.GetSemiconductorModuleContextWithSites(site_numbers)
semiconductor_module_context_with_sites = SemiconductorModuleContext.__new__(
SemiconductorModuleContext
)
semiconductor_module_context_with_sites._context = tsm_dispatch
return semiconductor_module_context_with_sites

def set_site_data(self, data_id: str, data: "_Sequence[_Any]") -> None:
"""Associates a data item with each site. You can associate data with all sites or with the
Expand Down
27 changes: 27 additions & 0 deletions tests/multi_site.pinmap
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<PinMap schemaVersion="1.2" xmlns="http://www.ni.com/TestStand/SemiconductorModule/PinMap.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Instruments>
<NIDigitalPatternInstrument name="DigitalPattern1" numberOfChannels="32" />
<NIDigitalPatternInstrument name="DigitalPattern2" numberOfChannels="32" />
</Instruments>
<Pins>
<DUTPin name="DUTPin1" />
<SystemPin name="SystemPin1" />
<SystemPin name="SystemPin2" />
</Pins>
<PinGroups></PinGroups>
<Sites>
<Site siteNumber="0" />
<Site siteNumber="1" />
<Site siteNumber="2" />
<Site siteNumber="3" />
</Sites>
<Connections>
<Connection pin="DUTPin1" siteNumber="0" instrument="DigitalPattern1" channel="0" />
<Connection pin="DUTPin1" siteNumber="1" instrument="DigitalPattern1" channel="1" />
<Connection pin="DUTPin1" siteNumber="2" instrument="DigitalPattern2" channel="0" />
<Connection pin="DUTPin1" siteNumber="3" instrument="DigitalPattern2" channel="1" />
<SystemConnection pin="SystemPin1" instrument="DigitalPattern1" channel="2" />
<SystemConnection pin="SystemPin2" instrument="DigitalPattern2" channel="2" />
</Connections>
</PinMap>
34 changes: 34 additions & 0 deletions tests/test_multi_site.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import pytest
from nitsm.codemoduleapi import SemiconductorModuleContext


@pytest.mark.pin_map("multi_site.pinmap")
class TestMultiSite:
pin_map_dut_pins = ["DUTPin1"]
pin_map_system_pins = ["SystemPin1", "SystemPin2"]
sites = 4 # [0, 1, 2, 3]

def test_get_semiconductor_module_with_sites(self, standalone_tsm_context):
# Get context for sites 1 and 3
site_numbers = [1, 3]
filtered_tsm_context = standalone_tsm_context.get_semiconductor_module_context_with_sites(
site_numbers
)
filtered_sites = list(filtered_tsm_context.site_numbers)

# Validate the site numbers
assert len(site_numbers) == len(filtered_sites)
assert site_numbers == filtered_sites
for site in site_numbers:
assert site in filtered_sites

# Validate that a fully initialized SemiconductorModuleContext wrapper is returned
assert isinstance(filtered_tsm_context, SemiconductorModuleContext)
# Exercise another wrapper method to catch initialization regressions
pin_names = list(
filtered_tsm_context.get_pin_names()
) # Should contain DUTPins and SystemPins as a tuple
assert isinstance(pin_names, list)
# Each item is a tuple, change it to list and compare
assert list(pin_names[0]) == self.pin_map_dut_pins
assert list(pin_names[1]) == self.pin_map_system_pins
Loading