ttnn-visualizer 0.45.0__py3-none-any.whl → 0.47.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. ttnn_visualizer/app.py +36 -1
  2. ttnn_visualizer/csv_queries.py +2 -1
  3. ttnn_visualizer/decorators.py +3 -3
  4. ttnn_visualizer/file_uploads.py +1 -1
  5. ttnn_visualizer/settings.py +1 -0
  6. ttnn_visualizer/sftp_operations.py +23 -8
  7. ttnn_visualizer/static/assets/allPaths-OR2-IW-_.js +1 -0
  8. ttnn_visualizer/static/assets/allPathsLoader-xRXweacG.js +2 -0
  9. ttnn_visualizer/static/assets/index-03c8d4Gh.js +1 -0
  10. ttnn_visualizer/static/assets/{index-BgTcwiDZ.js → index-CmA3KkTi.js} +390 -390
  11. ttnn_visualizer/static/assets/index-DJA68-a6.css +7 -0
  12. ttnn_visualizer/static/assets/index-PKNBViIU.js +1 -0
  13. ttnn_visualizer/static/assets/splitPathsBySizeLoader-P9sdNg6R.js +1 -0
  14. ttnn_visualizer/static/index.html +2 -2
  15. ttnn_visualizer/utils.py +190 -28
  16. ttnn_visualizer/views.py +32 -30
  17. {ttnn_visualizer-0.45.0.dist-info → ttnn_visualizer-0.47.0.dist-info}/METADATA +4 -3
  18. ttnn_visualizer-0.47.0.dist-info/RECORD +43 -0
  19. {ttnn_visualizer-0.45.0.dist-info → ttnn_visualizer-0.47.0.dist-info}/licenses/LICENSE +95 -45
  20. ttnn_visualizer/static/assets/allPaths-CWDYwlGf.js +0 -1
  21. ttnn_visualizer/static/assets/allPathsLoader-CWMmYjN2.js +0 -2
  22. ttnn_visualizer/static/assets/index-B-fsa5Ru.js +0 -1
  23. ttnn_visualizer/static/assets/index-DLOviMB1.js +0 -1
  24. ttnn_visualizer/static/assets/index-cjyfcubn.css +0 -7
  25. ttnn_visualizer/static/assets/splitPathsBySizeLoader-BHSjwVae.js +0 -1
  26. ttnn_visualizer-0.45.0.dist-info/RECORD +0 -43
  27. {ttnn_visualizer-0.45.0.dist-info → ttnn_visualizer-0.47.0.dist-info}/WHEEL +0 -0
  28. {ttnn_visualizer-0.45.0.dist-info → ttnn_visualizer-0.47.0.dist-info}/entry_points.txt +0 -0
  29. {ttnn_visualizer-0.45.0.dist-info → ttnn_visualizer-0.47.0.dist-info}/licenses/LICENSE_understanding.txt +0 -0
  30. {ttnn_visualizer-0.45.0.dist-info → ttnn_visualizer-0.47.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1 @@
1
+ import{p as r,I as s,_ as a}from"./index-CmA3KkTi.js";const n=async(o,_)=>{const i=r(o);let t;return _===s.STANDARD?t=await a(()=>import("./index-03c8d4Gh.js").then(e=>e.I),[]):t=await a(()=>import("./index-PKNBViIU.js").then(e=>e.I),[]),t[i]};export{n as splitPathsBySizeLoader};
@@ -34,8 +34,8 @@
34
34
  /* SERVER_CONFIG */
35
35
  </script>
36
36
 
37
- <script type="module" crossorigin src="/static/assets/index-BgTcwiDZ.js"></script>
38
- <link rel="stylesheet" crossorigin href="/static/assets/index-cjyfcubn.css">
37
+ <script type="module" crossorigin src="/static/assets/index-CmA3KkTi.js"></script>
38
+ <link rel="stylesheet" crossorigin href="/static/assets/index-DJA68-a6.css">
39
39
  </head>
40
40
  <body>
41
41
 
ttnn_visualizer/utils.py CHANGED
@@ -18,6 +18,127 @@ logger = logging.getLogger(__name__)
18
18
  LAST_SYNCED_FILE_NAME = ".last-synced"
19
19
 
20
20
 
21
+ class PathResolver:
22
+ """Centralized path resolution for both TT-Metal and upload/sync modes."""
23
+
24
+ def __init__(self, current_app):
25
+ self.current_app = current_app
26
+ self.tt_metal_home = current_app.config.get("TT_METAL_HOME")
27
+ self.is_direct_report_mode = bool(self.tt_metal_home)
28
+
29
+ def get_base_report_path(self, report_type: str, remote_connection=None):
30
+ """
31
+ Get the base path for a report type (profiler/performance).
32
+
33
+ Args:
34
+ report_type: Either 'profiler' or 'performance'
35
+ remote_connection: Optional remote connection for upload/sync mode
36
+
37
+ Returns:
38
+ Path object to the base directory for this report type
39
+ """
40
+ if self.is_direct_report_mode:
41
+ tt_metal_base = Path(self.tt_metal_home) / "generated"
42
+ if report_type == "profiler":
43
+ return tt_metal_base / "ttnn" / "reports"
44
+ elif report_type == "performance":
45
+ return tt_metal_base / "profiler" / "reports"
46
+ else:
47
+ raise ValueError(f"Unknown report type: {report_type}")
48
+ else:
49
+ # Upload/sync mode - use existing logic
50
+ local_dir = Path(self.current_app.config["LOCAL_DATA_DIRECTORY"])
51
+ remote_dir = Path(self.current_app.config["REMOTE_DATA_DIRECTORY"])
52
+
53
+ if remote_connection:
54
+ base_dir = remote_dir / remote_connection.host
55
+ else:
56
+ base_dir = local_dir
57
+
58
+ if report_type == "profiler":
59
+ return base_dir / self.current_app.config["PROFILER_DIRECTORY_NAME"]
60
+ elif report_type == "performance":
61
+ return base_dir / self.current_app.config["PERFORMANCE_DIRECTORY_NAME"]
62
+ else:
63
+ raise ValueError(f"Unknown report type: {report_type}")
64
+
65
+ def get_profiler_path(self, profiler_name: str, remote_connection=None):
66
+ """Get the full path to a profiler report's db.sqlite file."""
67
+ if not profiler_name:
68
+ return ""
69
+
70
+ base_path = self.get_base_report_path("profiler", remote_connection)
71
+
72
+ if self.is_direct_report_mode and not base_path.exists():
73
+ logger.warning(f"TT-Metal profiler reports not found: {base_path}")
74
+ return ""
75
+
76
+ profiler_path = base_path / profiler_name
77
+ target_path = profiler_path / self.current_app.config["SQLITE_DB_PATH"]
78
+
79
+ return str(target_path)
80
+
81
+ def get_performance_path(self, performance_name: str, remote_connection=None):
82
+ """Get the full path to a performance report directory."""
83
+ base_path = self.get_base_report_path("performance", remote_connection)
84
+
85
+ if self.is_direct_report_mode and not base_path.exists():
86
+ logger.warning(f"TT-Metal performance reports not found: {base_path}")
87
+ return ""
88
+
89
+ performance_path = base_path / performance_name
90
+ return str(performance_path)
91
+
92
+ def get_mode_info(self):
93
+ """Get information about the current mode for debugging/display."""
94
+ if self.is_direct_report_mode:
95
+ return {
96
+ "mode": "tt_metal",
97
+ "tt_metal_home": self.tt_metal_home,
98
+ "profiler_base": str(
99
+ Path(self.tt_metal_home) / "generated" / "ttnn" / "reports"
100
+ ),
101
+ "performance_base": str(
102
+ Path(self.tt_metal_home) / "generated" / "profiler" / "reports"
103
+ ),
104
+ }
105
+ else:
106
+ return {
107
+ "mode": "upload_sync",
108
+ "local_dir": str(self.current_app.config["LOCAL_DATA_DIRECTORY"]),
109
+ "remote_dir": str(self.current_app.config["REMOTE_DATA_DIRECTORY"]),
110
+ }
111
+
112
+ def validate_tt_metal_setup(self):
113
+ """Validate that TT-Metal directories exist and are accessible."""
114
+ if not self.is_direct_report_mode:
115
+ return True, "Not in TT-Metal mode"
116
+
117
+ tt_metal_base = Path(self.tt_metal_home)
118
+ if not tt_metal_base.exists():
119
+ return False, f"TT_METAL_HOME directory does not exist: {tt_metal_base}"
120
+
121
+ generated_dir = tt_metal_base / "generated"
122
+ if not generated_dir.exists():
123
+ return False, f"TT-Metal generated directory not found: {generated_dir}"
124
+
125
+ profiler_base = self.get_base_report_path("profiler")
126
+ performance_base = self.get_base_report_path("performance")
127
+
128
+ messages = []
129
+ if not profiler_base.exists():
130
+ messages.append(f"Profiler reports directory not found: {profiler_base}")
131
+ if not performance_base.exists():
132
+ messages.append(
133
+ f"Performance reports directory not found: {performance_base}"
134
+ )
135
+
136
+ if messages:
137
+ return False, "; ".join(messages)
138
+
139
+ return True, "TT-Metal setup is valid"
140
+
141
+
21
142
  def str_to_bool(string_value):
22
143
  return string_value.lower() in ("yes", "true", "t", "1")
23
144
 
@@ -52,20 +173,10 @@ def get_performance_path(performance_name, current_app, remote_connection=None):
52
173
  :param current_app: Flask current application object.
53
174
  :param remote_connection: Remote connection model instance
54
175
 
55
- :return: Profiler path as a string.
176
+ :return: Performance path as a string.
56
177
  """
57
- local_dir = Path(current_app.config["LOCAL_DATA_DIRECTORY"])
58
- remote_dir = Path(current_app.config["REMOTE_DATA_DIRECTORY"])
59
-
60
- if remote_connection:
61
- base_dir = Path(remote_dir).joinpath(remote_connection.host)
62
- else:
63
- base_dir = local_dir
64
-
65
- profiler_dir = base_dir / current_app.config["PERFORMANCE_DIRECTORY_NAME"]
66
- performance_path = profiler_dir / performance_name
67
-
68
- return str(performance_path)
178
+ resolver = PathResolver(current_app)
179
+ return resolver.get_performance_path(performance_name, remote_connection)
69
180
 
70
181
 
71
182
  def get_profiler_path(profiler_name, current_app, remote_connection=None):
@@ -77,24 +188,75 @@ def get_profiler_path(profiler_name, current_app, remote_connection=None):
77
188
 
78
189
  :return: profiler_path as a string
79
190
  """
80
- database_file_name = current_app.config["SQLITE_DB_PATH"]
81
- local_dir = current_app.config["LOCAL_DATA_DIRECTORY"]
82
- remote_dir = current_app.config["REMOTE_DATA_DIRECTORY"]
191
+ resolver = PathResolver(current_app)
192
+ return resolver.get_profiler_path(profiler_name, remote_connection)
83
193
 
84
- if profiler_name:
85
- if remote_connection:
86
- base_dir = Path(remote_dir).joinpath(remote_connection.host)
87
- else:
88
- base_dir = local_dir
89
194
 
90
- profiler_path = (
91
- base_dir / current_app.config["PROFILER_DIRECTORY_NAME"] / profiler_name
92
- )
93
- target_path = profiler_path / database_file_name
195
+ def create_path_resolver(current_app):
196
+ """Create a PathResolver instance for the current app."""
197
+ return PathResolver(current_app)
94
198
 
95
- return str(target_path)
96
- else:
97
- return ""
199
+
200
+ def get_available_reports(current_app):
201
+ """
202
+ Get available reports in the current mode.
203
+
204
+ Returns a dict with 'profiler' and 'performance' keys containing lists of available reports.
205
+ This is a convenience function for views that need to discover available reports.
206
+ """
207
+ resolver = PathResolver(current_app)
208
+
209
+ reports = {"profiler": [], "performance": []}
210
+
211
+ # Get profiler reports
212
+ try:
213
+ profiler_base = resolver.get_base_report_path("profiler")
214
+ if profiler_base.exists():
215
+ for report_dir in profiler_base.iterdir():
216
+ if report_dir.is_dir():
217
+ db_file = report_dir / current_app.config["SQLITE_DB_PATH"]
218
+ if db_file.exists():
219
+ reports["profiler"].append(
220
+ {
221
+ "name": report_dir.name,
222
+ "path": str(report_dir),
223
+ "modified": report_dir.stat().st_mtime,
224
+ }
225
+ )
226
+ except Exception as e:
227
+ logger.warning(f"Error reading profiler reports: {e}")
228
+
229
+ # Get performance reports
230
+ try:
231
+ performance_base = resolver.get_base_report_path("performance")
232
+ if performance_base.exists():
233
+ for report_dir in performance_base.iterdir():
234
+ if report_dir.is_dir():
235
+ # Check for typical performance files
236
+ has_perf_files = any(
237
+ (report_dir / filename).exists()
238
+ for filename in [
239
+ "profile_log_device.csv",
240
+ "tracy_profile_log_host.tracy",
241
+ ]
242
+ ) or any(report_dir.glob("ops_perf_results*.csv"))
243
+
244
+ if has_perf_files:
245
+ reports["performance"].append(
246
+ {
247
+ "name": report_dir.name,
248
+ "path": str(report_dir),
249
+ "modified": report_dir.stat().st_mtime,
250
+ }
251
+ )
252
+ except Exception as e:
253
+ logger.warning(f"Error reading performance reports: {e}")
254
+
255
+ # Sort by modification time (newest first)
256
+ reports["profiler"].sort(key=lambda x: x["modified"], reverse=True)
257
+ reports["performance"].sort(key=lambda x: x["modified"], reverse=True)
258
+
259
+ return reports
98
260
 
99
261
 
100
262
  def get_npe_path(npe_name, current_app):
ttnn_visualizer/views.py CHANGED
@@ -7,7 +7,6 @@ import json
7
7
  import logging
8
8
  import re
9
9
  import shutil
10
- import subprocess
11
10
  import time
12
11
  from http import HTTPStatus
13
12
  from pathlib import Path
@@ -69,6 +68,7 @@ from ttnn_visualizer.sftp_operations import (
69
68
  )
70
69
  from ttnn_visualizer.ssh_client import SSHClient
71
70
  from ttnn_visualizer.utils import (
71
+ create_path_resolver,
72
72
  get_cluster_descriptor_path,
73
73
  read_last_synced_file,
74
74
  timer,
@@ -369,20 +369,18 @@ def get_operation_buffers(operation_id, instance: Instance):
369
369
  @api.route("/profiler", methods=["GET"])
370
370
  @with_instance
371
371
  def get_profiler_data_list(instance: Instance):
372
- # Doesn't handle remote at the moment
373
- # is_remote = True if instance.remote_connection else False
374
- # config_key = "REMOTE_DATA_DIRECTORY" if is_remote else "LOCAL_DATA_DIRECTORY"
375
- config_key = "LOCAL_DATA_DIRECTORY"
376
- data_directory = Path(current_app.config[config_key])
372
+ # Use PathResolver to get the base path for profiler reports
373
+ resolver = create_path_resolver(current_app)
377
374
 
378
- # if is_remote:
379
- # connection = RemoteConnection.model_validate(instance.remote_connection, strict=False)
380
- # path = data_directory / connection.host / current_app.config["PROFILER_DIRECTORY_NAME"]
381
- # else:
382
- path = data_directory / current_app.config["PROFILER_DIRECTORY_NAME"]
375
+ # Note: "profiler" in app terminology maps to tt-metal's ttnn/reports
376
+ path = resolver.get_base_report_path("profiler", instance.remote_connection)
383
377
 
384
378
  if not path.exists():
385
- path.mkdir(parents=True, exist_ok=True)
379
+ if resolver.is_direct_report_mode:
380
+ logger.warning(f"TT-Metal profiler reports not found: {path}")
381
+ return jsonify([])
382
+ else:
383
+ path.mkdir(parents=True, exist_ok=True)
386
384
 
387
385
  valid_dirs = []
388
386
 
@@ -438,7 +436,6 @@ def get_profiler_data_list(instance: Instance):
438
436
  continue
439
437
  if not any(file.name == "config.json" for file in files):
440
438
  continue
441
-
442
439
  valid_dirs.append({"path": dir_path.name, "reportName": report_name})
443
440
 
444
441
  return jsonify(valid_dirs)
@@ -492,13 +489,20 @@ def delete_profiler_report(profiler_name, instance: Instance):
492
489
  @api.route("/performance", methods=["GET"])
493
490
  @with_instance
494
491
  def get_performance_data_list(instance: Instance):
492
+ # Use PathResolver to get the base path for performance reports
493
+ resolver = create_path_resolver(current_app)
494
+
495
+ # Note: "performance" in app terminology maps to tt-metal's profiler/reports
496
+ path = resolver.get_base_report_path("performance", instance.remote_connection)
497
+
495
498
  is_remote = True if instance.remote_connection else False
496
- config_key = "REMOTE_DATA_DIRECTORY" if is_remote else "LOCAL_DATA_DIRECTORY"
497
- data_directory = Path(current_app.config[config_key])
498
- path = data_directory / current_app.config["PERFORMANCE_DIRECTORY_NAME"]
499
499
 
500
- if not is_remote and not path.exists():
501
- path.mkdir(parents=True, exist_ok=True)
500
+ if not path.exists():
501
+ if resolver.is_direct_report_mode:
502
+ logger.warning(f"TT-Metal performance reports not found: {path}")
503
+ return jsonify([])
504
+ elif not is_remote:
505
+ path.mkdir(parents=True, exist_ok=True)
502
506
 
503
507
  if current_app.config["SERVER_MODE"]:
504
508
  session_instances = session.get("instances", [])
@@ -522,15 +526,7 @@ def get_performance_data_list(instance: Instance):
522
526
  set(db_directory_names + session_directory_names + demo_directory_names)
523
527
  )
524
528
  else:
525
- if is_remote:
526
- connection = RemoteConnection.model_validate(
527
- instance.remote_connection, strict=False
528
- )
529
- path = (
530
- data_directory
531
- / connection.host
532
- / current_app.config["PERFORMANCE_DIRECTORY_NAME"]
533
- )
529
+ # PathResolver already handles remote vs local logic
534
530
  directory_names = (
535
531
  [directory.name for directory in path.iterdir() if directory.is_dir()]
536
532
  if path.exists()
@@ -560,7 +556,12 @@ def get_performance_data_list(instance: Instance):
560
556
  if not any(file.name.startswith("ops_perf_results") for file in files):
561
557
  continue
562
558
 
563
- valid_dirs.append({"path": dir_path.name, "reportName": dir_path.name})
559
+ valid_dirs.append(
560
+ {
561
+ "path": dir_path.name,
562
+ "reportName": dir_path.name,
563
+ }
564
+ )
564
565
 
565
566
  return jsonify(valid_dirs)
566
567
 
@@ -1018,7 +1019,7 @@ def test_remote_folder():
1018
1019
  )
1019
1020
 
1020
1021
  # Test Directory Configuration
1021
- if not has_failures():
1022
+ if not has_failures() and connection.profilerPath:
1022
1023
  try:
1023
1024
  check_remote_path_exists(connection, "profilerPath")
1024
1025
  add_status(ConnectionTestStates.OK.value, "Memory folder path exists")
@@ -1068,7 +1069,8 @@ def test_remote_folder():
1068
1069
  def read_remote_folder():
1069
1070
  connection = RemoteConnection.model_validate(request.json, strict=False)
1070
1071
  try:
1071
- content = read_remote_file(connection, remote_path=connection.path)
1072
+ # Only profilerPath is relevant here as we're reading the stack trace file
1073
+ content = read_remote_file(connection, remote_path=connection.profilerPath)
1072
1074
  except RemoteConnectionException as e:
1073
1075
  return Response(status=e.http_status, response=e.message)
1074
1076
  return Response(status=200, response=content)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ttnn_visualizer
3
- Version: 0.45.0
3
+ Version: 0.47.0
4
4
  Summary: TT-NN Visualizer
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -18,8 +18,8 @@ Requires-Dist: Flask==3.1.1
18
18
  Requires-Dist: gevent==24.10.2
19
19
  Requires-Dist: gunicorn~=23.0.0
20
20
  Requires-Dist: pandas==2.2.3
21
- Requires-Dist: pydantic_core==2.18.4
22
- Requires-Dist: pydantic==2.7.3
21
+ Requires-Dist: pydantic_core==2.27.1
22
+ Requires-Dist: pydantic==2.10.3
23
23
  Requires-Dist: python-dotenv==1.0.1
24
24
  Requires-Dist: PyYAML==6.0.2
25
25
  Requires-Dist: tt-perf-report==1.0.7
@@ -29,6 +29,7 @@ Provides-Extra: dev
29
29
  Requires-Dist: black==25.1.0; extra == "dev"
30
30
  Requires-Dist: isort==6.0.1; extra == "dev"
31
31
  Requires-Dist: mypy; extra == "dev"
32
+ Requires-Dist: playwright==1.48.0; extra == "dev"
32
33
  Requires-Dist: pytest==8.4.1; extra == "dev"
33
34
  Dynamic: license-file
34
35
 
@@ -0,0 +1,43 @@
1
+ ttnn_visualizer/__init__.py,sha256=FCQeTWnXsf-Wx-fay53-lQsm0y5-GcPMUmzhE5upDx0,93
2
+ ttnn_visualizer/app.py,sha256=5LEFKR-jn5HGqzYU1OWE4LCHzS4OAzwLKge5jSRDsBc,8663
3
+ ttnn_visualizer/csv_queries.py,sha256=pQV3WJ0jSMo84L7kOdAbGO5lGfOtcq-oAlHzu09ND2Q,15089
4
+ ttnn_visualizer/decorators.py,sha256=8k73rTiGPSpPP5CHxzLxTQPxoQTAlhMQNcEbplQL3Ek,5805
5
+ ttnn_visualizer/enums.py,sha256=SEIqp1tlc_zw2vQ8nHH9YTaV0m3Cb8fjn_goqz5wurE,203
6
+ ttnn_visualizer/exceptions.py,sha256=XwTIykJpdvZV8nqrd9JZdHIYL0EBFBhTbE9H09VZluA,2273
7
+ ttnn_visualizer/extensions.py,sha256=6OIRJ8-_ccfjOaXSruRXiS29jEbxp4Pyk-0JlD8IHBQ,379
8
+ ttnn_visualizer/file_uploads.py,sha256=HFcC6TBt5I0oBkiKgM2Qw1W7hpixE8TOTACS5N-rmGE,5013
9
+ ttnn_visualizer/instances.py,sha256=XctQgQXdlwtuXWFXFletRoX1m1lGUZdiW3TwIIjY0uw,11564
10
+ ttnn_visualizer/models.py,sha256=oxZVvWjtBDP0X6GqoYaH4wDa5PqJF_vG_I3Q_YWHMmo,7814
11
+ ttnn_visualizer/queries.py,sha256=3Nv0jXIDNVH-qKx9xc9zSINy4FdmDidu-1I6f-VYV48,9603
12
+ ttnn_visualizer/remote_sqlite_setup.py,sha256=VdJk5LfkaJo1XPC-yxy909I0AOgJF1GUjryj0Oe0O14,3498
13
+ ttnn_visualizer/serializers.py,sha256=LmjHIrFg8BLx1JKVFh9Nd_TcA7nyy1MwY2BOGnX1MKw,8029
14
+ ttnn_visualizer/settings.py,sha256=W0PCeBCGXONNfFHqI7ATCVGhKv0a02-BhwBwrB3Clag,4660
15
+ ttnn_visualizer/sftp_operations.py,sha256=9HwbPJPSO1UUQ98d5zeWAkEwR0zFPryUakcI68GqkVw,30181
16
+ ttnn_visualizer/sockets.py,sha256=W5pK0QmlsU58EH_Qnra6HlcswLS7vsw5C_pk4avVYvs,3706
17
+ ttnn_visualizer/ssh_client.py,sha256=-GS2_1tdlUqVoLfRS02i3_o1fQaM39UQN-jtAnPBmzQ,13511
18
+ ttnn_visualizer/utils.py,sha256=_W990vRnup9zlWJ-g_Bggyo-wDjCYF49p0nPxWNgxrE,12934
19
+ ttnn_visualizer/views.py,sha256=4l9bYIdDMyui1WjBDOn7rJ9V4egc439jeN1uG47Yk7Y,43072
20
+ ttnn_visualizer/static/index.html,sha256=5kiMyUyhbOhgwPgREMpeH3v-AGdP5G4Qtb10TcV7A-w,1135
21
+ ttnn_visualizer/static/assets/allPaths-OR2-IW-_.js,sha256=Oh2drbxvlmAIFWE4Srb9Pi8hdb__NF3_mVn2Vm60UI4,255
22
+ ttnn_visualizer/static/assets/allPathsLoader-xRXweacG.js,sha256=co2dBtSW_xZQ_XduamaE0h5AVsH-Ldswk44uwD7QvNc,477
23
+ ttnn_visualizer/static/assets/index-03c8d4Gh.js,sha256=k0jIi5q-lzXcPCqAD7K091vBMOkJHmx_fYcYKh-fOnM,285602
24
+ ttnn_visualizer/static/assets/index-CmA3KkTi.js,sha256=rp_h66A8t5Jl7OwbDKnM6bj03uE_H2bwqBAc6aIuIKY,7882665
25
+ ttnn_visualizer/static/assets/index-DJA68-a6.css,sha256=sPrF4HPkGtkuy0Ae8wkQXcUUzGGRGeKNeymUY6YPtwo,622830
26
+ ttnn_visualizer/static/assets/index-PKNBViIU.js,sha256=dUuCyAPr_QvvTY0Xula4q4rgOm1J7xgdbppL67off4k,294225
27
+ ttnn_visualizer/static/assets/site-BTBrvHC5.webmanifest,sha256=Uy_XmnGuYFVf-OZuma2NvgEPdrCrevb3HZvaxSIHoA0,456
28
+ ttnn_visualizer/static/assets/splitPathsBySizeLoader-P9sdNg6R.js,sha256=hrgrHehC3Bwy8EF3pWi11eVXlDm4JZ9Y2-j7CSX0WCY,281
29
+ ttnn_visualizer/static/favicon/android-chrome-192x192.png,sha256=BZWA09Zxaa3fXbaeS6nhWo2e-DUSjm9ElzNQ_xTB5XU,6220
30
+ ttnn_visualizer/static/favicon/android-chrome-512x512.png,sha256=HBiJSZyguB3o8fMJuqIGcpeBy_9JOdImme3wD02UYCw,62626
31
+ ttnn_visualizer/static/favicon/favicon-32x32.png,sha256=Zw201qUsczQv1UvoQvJf5smQ2ss10xaTeWxmQNYCGtY,480
32
+ ttnn_visualizer/static/favicon/favicon.svg,sha256=wDPY3VrekJ_DE1TnJ2vUy602K3S4Xe9TgrdZ7jXK9c8,633
33
+ ttnn_visualizer/static/sample-data/cluster-desc.yaml,sha256=LMxOmsRUXtVVU5ogzYkXUozB3dg2IzqIRJQpV_O5qMU,29618
34
+ ttnn_visualizer/tests/__init__.py,sha256=FCQeTWnXsf-Wx-fay53-lQsm0y5-GcPMUmzhE5upDx0,93
35
+ ttnn_visualizer/tests/test_queries.py,sha256=HqaDXwudZpXiigJdHkdJP8oiUc-PtHASbpLnQQpbD7A,13792
36
+ ttnn_visualizer/tests/test_serializers.py,sha256=AF6m6tvewnZ_OSQMgMTUhsOI26GdJHPajvnRGIa9P4U,18492
37
+ ttnn_visualizer-0.47.0.dist-info/licenses/LICENSE,sha256=gcO1GgS_1J-gOVcHALMiIPsyPv2Pu7hSSHhsgkp6F_Y,19345
38
+ ttnn_visualizer-0.47.0.dist-info/licenses/LICENSE_understanding.txt,sha256=pymi-yb_RvYM9p2ZA4iSNsImcvhDBBxlGuJCY9dTq7M,233
39
+ ttnn_visualizer-0.47.0.dist-info/METADATA,sha256=ugKvf2bHr5oB9S0nXFfYV8tRTBr652XPa3t43IrnFRI,7751
40
+ ttnn_visualizer-0.47.0.dist-info/WHEEL,sha256=lTU6B6eIfYoiQJTZNc-fyaR6BpL6ehTzU3xGYxn2n8k,91
41
+ ttnn_visualizer-0.47.0.dist-info/entry_points.txt,sha256=QpuUpkmQ_mEHJTMqOBdU0MH2Z4WF_9iFsGACeyyAO1E,61
42
+ ttnn_visualizer-0.47.0.dist-info/top_level.txt,sha256=M1EGkvDOuIfbhDbcUdz2-TSdmCtDoQ2Uyag9k5JLDSY,16
43
+ ttnn_visualizer-0.47.0.dist-info/RECORD,,
@@ -77,50 +77,100 @@ Third-Party Dependencies:
77
77
 
78
78
  The following separate and independent dependencies are utilized by this project but are not distributed as part of the software and are subject to their own license terms listed as follows:
79
79
 
80
- - @blueprintjs/colors Apache-2.0 https://github.com/palantir/blueprint/blob/develop/packages/colors/LICENSE
81
- - @blueprintjs/core Apache-2.0 https://github.com/palantir/blueprint/blob/develop/packages/core/LICENSE
82
- - @blueprintjs/icons Apache-2.0 https://github.com/palantir/blueprint/blob/develop/packages/icons/LICENSE
83
- - @blueprintjs/select Apache-2.0 https://github.com/palantir/blueprint/blob/develop/packages/select/LICENSE
84
- - @blueprintjs/table Apache-2.0 https://github.com/palantir/blueprint/blob/develop/packages/table/LICENSE
85
- - @tanstack/react-virtual MIT https://github.com/TanStack/virtual/blob/main/LICENSE
86
- - @types/tinycolor2 MIT https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/tinycolor2/LICENSE
87
- - axios MIT https://github.com/axios/axios/blob/v1.x/LICENSE
88
- - css-select BSD‑2-Clause https://github.com/fb55/css-select/blob/master/LICENSE
89
- - dom-serializer MIT https://github.com/cheeriojs/dom-serializer/blob/master/LICENSE
90
- - immutable MIT https://github.com/immutable-js/immutable-js/blob/master/LICENSE
91
- - jotai MIT https://github.com/pmndrs/jotai/blob/main/LICENSE
92
- - mini-svg-data-uri MIT https://github.com/tigt/mini-svg-data-uri/blob/master/LICENSE
93
- - normalize.css MIT https://github.com/necolas/normalize.css/blob/master/LICENSE.md
94
- - papaparse MIT https://github.com/mholt/PapaParse/blob/master/LICENSE
95
- - plotly.js MIT https://github.com/plotly/plotly.js/blob/master/LICENSE
96
- - react MIT https://github.com/facebook/react/blob/main/LICENSE
97
- - react-dom MIT https://github.com/facebook/react/blob/main/LICENSE
98
- - react-helmet-async MIT https://github.com/staylor/react-helmet-async/blob/main/LICENSE
99
- - react-plotly.js MIT https://github.com/plotly/react-plotly.js/blob/master/LICENSE
100
- - react-query MIT https://github.com/TanStack/query/blob/main/LICENSE
101
- - react-router MIT https://github.com/remix-run/react-router/blob/main/LICENSE
102
- - react-router-dom MIT https://github.com/remix-run/react-router/blob/main/LICENSE.md
103
- - react-toastify MIT https://github.com/fkhadra/react-toastify/blob/main/LICENSE
104
- - socket.io-client MIT https://www.npmjs.com/package/socket.io-client
105
- - tinycolor2 MIT https://github.com/bgrins/TinyColor/blob/master/LICENSE
106
- - vis-data – Dual-license Apache‑2.0 or MIT https://github.com/visjs/vis-data/blob/master/LICENSE-MIT and LICENSE-APACHE-2.0
107
- - vis-network – Dual-license Apache‑2.0 or MIT part of vis.js suite; see https://almende.github.io/vis/ (“Vis.js is dual licensed under both Apache-2.0 and MIT”)
108
-
109
- - Flask BSD‑3‑Clause https://github.com/pallets/flask/blob/main/LICENSE.txt
110
- - gunicorn MIT https://github.com/benoitc/gunicorn/blob/master/LICENSE
111
- - uvicorn BSD‑3‑Clause https://github.com/encode/uvicorn/blob/master/LICENSE.md
112
- - flask_cors MIT https://github.com/corydolphin/flask-cors/blob/main/LICENSE
113
- - pydantic MIT https://github.com/pydantic/pydantic-settings/blob/main/LICENSE
114
- - setuptools MIT https://github.com/pypa/setuptools/blob/main/LICENSE
115
- - python-dotenv BSD‑3‑Clause https://github.com/theskumar/python-dotenv/blob/main/LICENSE
116
- - flask-sqlalchemy BSD‑3‑Clause https://github.com/pallets-eco/flask-sqlalchemy/blob/main/LICENSE
117
- - flask-socketio MIT https://github.com/miguelgrinberg/Flask-SocketIO/blob/main/LICENSE
118
- - PyYAML MIT https://github.com/yaml/pyyaml/blob/main/LICENSE
119
- - gevent MIT https://github.com/gevent/gevent/blob/master/LICENSE
120
- - pandas BSD‑3‑Clause https://github.com/pandas-dev/pandas/blob/main/LICENSE
121
- - wheel MIT https://opensource.org/license/mit
122
- - build MIT https://opensource.org/license/mit
123
- - tt-perf-report MIT https://opensource.org/license/mit
124
- - zstd (python-zstandard) BSD‑3‑Clause https://github.com/indygreg/python-zstandard/blob/main/LICENSE
80
+ - @blueprintjs/colors - Apache-2.0 - https://github.com/palantir/blueprint/blob/develop/packages/colors/LICENSE
81
+ - @blueprintjs/core - Apache-2.0 - https://github.com/palantir/blueprint/blob/develop/packages/core/LICENSE
82
+ - @blueprintjs/icons - Apache-2.0 - https://github.com/palantir/blueprint/blob/develop/packages/icons/LICENSE
83
+ - @blueprintjs/node-build-scripts - Apache-2.0 - https://github.com/palantir/blueprint/blob/develop/packages/node-build-scripts/LICENSE
84
+ - @blueprintjs/select - Apache-2.0 - https://github.com/palantir/blueprint/blob/develop/packages/select/LICENSE
85
+ - @blueprintjs/table - Apache-2.0 - https://github.com/palantir/blueprint/blob/develop/packages/table/LICENSE
86
+ - @eslint/compat - Apache-2.0 - https://github.com/eslint/rewrite/blob/main/packages/compat/LICENSE
87
+ - @eslint/eslintrc - MIT - https://github.com/eslint/eslintrc/blob/main/LICENSE
88
+ - @eslint/js - MIT - https://github.com/eslint/eslint/blob/main/LICENSE
89
+ - @eslint/rewrite - Apache-2.0 - https://github.com/eslint/rewrite/blob/main/LICENSE
90
+ - @tanstack/react-virtual - MIT - https://github.com/TanStack/virtual/blob/main/LICENSE
91
+ - @testing-library/dom - MIT - https://github.com/testing-library/dom-testing-library/blob/main/LICENSE
92
+ - @testing-library/jest-dom - MIT - https://github.com/testing-library/jest-dom/blob/main/LICENSE
93
+ - @testing-library/react - MIT - https://github.com/testing-library/react-testing-library/blob/main/LICENSE
94
+ - @types/papaparse - MIT - https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/LICENSE
95
+ - @types/react - MIT - https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/LICENSE
96
+ - @types/react-dom - MIT - https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/LICENSE
97
+ - @types/react-plotly.js - MIT - https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/LICENSE
98
+ - @types/tinycolor2 - MIT - https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/tinycolor2/LICENSE
99
+ - @typescript-eslint/eslint-plugin - MIT - https://github.com/typescript-eslint/typescript-eslint/blob/main/LICENSE
100
+ - @typescript-eslint/parser - MIT - https://github.com/typescript-eslint/typescript-eslint/blob/main/LICENSE
101
+ - @vitejs/plugin-react - MIT - https://github.com/vitejs/vite-plugin-react/blob/main/LICENSE
102
+ - ajv - MIT - https://github.com/ajv-validator/ajv/blob/master/LICENSE
103
+ - axios - MIT - https://github.com/axios/axios/blob/v1.x/LICENSE
104
+ - classnames - MIT - https://github.com/JedWatson/classnames/blob/main/LICENSE
105
+ - css-select - BSD‑2-Clause - https://github.com/fb55/css-select/blob/master/LICENSE
106
+ - dom-serializer - MIT - https://github.com/cheeriojs/dom-serializer/blob/master/LICENSE
107
+ - eslint - MIT - https://github.com/eslint/eslint/blob/main/LICENSE
108
+ - eslint-config-airbnb-base - MIT - https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb-base/LICENSE.md
109
+ - eslint-config-erb - MIT - https://github.com/electron-react-boilerplate/eslint-config-erb/blob/main/LICENSE
110
+ - eslint-config-prettier - MIT - https://github.com/prettier/eslint-config-prettier/blob/main/LICENSE
111
+ - eslint-import-resolver-alias - MIT - https://github.com/johvin/eslint-import-resolver-alias/blob/master/LICENSE
112
+ - eslint-import-resolver-typescript - ISC - https://github.com/import-js/eslint-import-resolver-typescript/blob/master/LICENSE
113
+ - eslint-plugin-compat - MIT - https://github.com/amilajack/eslint-plugin-compat/blob/main/LICENSE
114
+ - eslint-plugin-import - MIT - https://github.com/import-js/eslint-plugin-import/blob/main/LICENSE
115
+ - eslint-plugin-jsx-a11y - MIT - https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/LICENSE.md
116
+ - eslint-plugin-prettier - MIT - https://github.com/prettier/eslint-plugin-prettier/blob/main/LICENSE.md
117
+ - eslint-plugin-promise - ISC - https://github.com/eslint-community/eslint-plugin-promise/blob/main/LICENSE.md
118
+ - eslint-plugin-react - MIT - https://github.com/jsx-eslint/eslint-plugin-react/blob/master/LICENSE
119
+ - eslint-plugin-react-hooks - MIT - https://github.com/facebook/react/blob/main/LICENSE
120
+ - eslint-plugin-react-refresh - MIT - https://github.com/ArnaudBarre/eslint-plugin-react-refresh/blob/main/LICENSE
121
+ - eslint-plugin-unused-imports - MIT - https://github.com/sweepline/eslint-plugin-unused-imports/blob/master/LICENSE
122
+ - globals - MIT - https://github.com/sindresorhus/globals/blob/main/license
123
+ - highlight.js - BSD-3-Clause - https://github.com/highlightjs/highlight.js/blob/main/LICENSE
124
+ - htmlparser2 - MIT - https://github.com/fb55/htmlparser2/blob/master/LICENSE
125
+ - husky - MIT - https://github.com/typicode/husky/blob/main/LICENSE
126
+ - immutable - MIT - https://github.com/immutable-js/immutable-js/blob/master/LICENSE
127
+ - jotai - MIT - https://github.com/pmndrs/jotai/blob/main/LICENSE
128
+ - jsdom - MIT - https://github.com/jsdom/jsdom/blob/main/LICENSE.txt
129
+ - lint-staged - MIT - https://github.com/lint-staged/lint-staged/blob/main/LICENSE
130
+ - mini-svg-data-uri - MIT - https://github.com/tigt/mini-svg-data-uri/blob/master/LICENSE
131
+ - normalize.css - MIT - https://github.com/necolas/normalize.css/blob/master/LICENSE.md
132
+ - only-allow - MIT - https://github.com/pnpm/only-allow/blob/master/LICENSE
133
+ - papaparse - MIT - https://github.com/mholt/PapaParse/blob/master/LICENSE
134
+ - plotly.js - MIT - https://github.com/plotly/plotly.js/blob/master/LICENSE
135
+ - prettier - MIT - https://github.com/prettier/eslint-config-prettier/blob/main/LICENSE
136
+ - react - MIT - https://github.com/facebook/react/blob/main/LICENSE
137
+ - react-dom - MIT - https://github.com/facebook/react/blob/main/LICENSE
138
+ - react-helmet-async - MIT - https://github.com/staylor/react-helmet-async/blob/main/LICENSE
139
+ - react-plotly.js - MIT - https://github.com/plotly/react-plotly.js/blob/master/LICENSE
140
+ - react-query - MIT - https://github.com/TanStack/query/blob/main/LICENSE
141
+ - react-router - MIT - https://github.com/remix-run/react-router/blob/main/LICENSE
142
+ - react-router-dom - MIT - https://github.com/remix-run/react-router/blob/main/LICENSE.md
143
+ - react-toastify - MIT - https://github.com/fkhadra/react-toastify/blob/main/LICENSE
144
+ - sass - MIT - https://github.com/sass/dart-sass/blob/main/LICENSE
145
+ - socket.io-client - MIT - https://www.npmjs.com/package/socket.io-client
146
+ - stylelint - MIT - https://github.com/stylelint/stylelint/blob/main/LICENSE
147
+ - stylelint-config-standard-scss - MIT - https://github.com/stylelint-scss/stylelint-config-standard-scss/blob/main/LICENSE
148
+ - stylelint-prettier - MIT - https://github.com/prettier/stylelint-prettier/blob/main/LICENSE.md
149
+ - svgo - MIT - https://github.com/svg/svgo/blob/main/LICENSE
150
+ - tinycolor2 - MIT - https://github.com/bgrins/TinyColor/blob/master/LICENSE
151
+ - typescript - Apache-2.0 - https://github.com/microsoft/TypeScript/blob/main/LICENSE.txt
152
+ - vis-data - Dual-license Apache‑2.0 or MIT - https://github.com/visjs/vis-data/blob/master/LICENSE-APACHE-2.0 and https://github.com/visjs/vis-data/blob/master/LICENSE-MIT
153
+ - vis-network - Dual-license Apache‑2.0 or MIT - https://github.com/visjs/vis-network/blob/master/LICENSE-APACHE-2.0 or
154
+ - vite - MIT - https://github.com/vitejs/vite/blob/main/LICENSE
155
+ - vitest - MIT - https://github.com/vitest-dev/vitest/blob/main/LICENSE
156
+ - vitest-canvas-mock - MIT - https://github.com/wobsoriano/vitest-canvas-mock/blob/main/LICENSE
157
+
158
+ - build - MIT https://opensource.org/license/mit
159
+ - Flask - BSD‑3‑Clause - https://github.com/pallets/flask/blob/main/LICENSE.txt
160
+ - flask_cors - MIT - https://github.com/corydolphin/flask-cors/blob/main/LICENSE
161
+ - flask-socketio - MIT - https://github.com/miguelgrinberg/Flask-SocketIO/blob/main/LICENSE
162
+ - flask-sqlalchemy - BSD‑3‑Clause - https://github.com/pallets-eco/flask-sqlalchemy/blob/main/LICENSE
163
+ - gevent - MIT - https://github.com/gevent/gevent/blob/master/LICENSE
164
+ - gunicorn - MIT - https://github.com/benoitc/gunicorn/blob/master/LICENSE
165
+ - pandas - BSD‑3‑Clause - https://github.com/pandas-dev/pandas/blob/main/LICENSE
166
+ - playwright - Apache-2.0 - https://github.com/microsoft/playwright-python/blob/main/LICENSE
167
+ - pydantic - MIT - https://github.com/pydantic/pydantic-settings/blob/main/LICENSE
168
+ - python-dotenv - BSD‑3‑Clause - https://github.com/theskumar/python-dotenv/blob/main/LICENSE
169
+ - PyYAML - MIT - https://github.com/yaml/pyyaml/blob/main/LICENSE
170
+ - setuptools - MIT - https://github.com/pypa/setuptools/blob/main/LICENSE
171
+ - tt-perf-report - MIT https://opensource.org/license/mit
172
+ - uvicorn - BSD‑3‑Clause - https://github.com/encode/uvicorn/blob/master/LICENSE.md
173
+ - wheel - MIT https://opensource.org/license/mit
174
+ - zstd (python-zstandard) - BSD‑3‑Clause - https://github.com/indygreg/python-zstandard/blob/main/LICENSE
125
175
 
126
176
  - Upload Release Assets - GitHub Action - MIT - https://github.com/AButler/upload-release-assets/blob/master/LICENSE
@@ -1 +0,0 @@
1
- import{I as n}from"./index-DLOviMB1.js";import{I as e}from"./index-B-fsa5Ru.js";import{p as r,I as s}from"./index-BgTcwiDZ.js";function I(o,t){var a=r(o);return t===s.STANDARD?n[a]:e[a]}function p(o){return r(o)}export{n as IconSvgPaths16,e as IconSvgPaths20,I as getIconPaths,p as iconNameToPathsRecordKey};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/allPaths-CWDYwlGf.js","assets/index-DLOviMB1.js","assets/index-B-fsa5Ru.js","assets/index-BgTcwiDZ.js","assets/index-cjyfcubn.css"])))=>i.map(i=>d[i]);
2
- import{_ as o,a as n,b as i}from"./index-BgTcwiDZ.js";var _=function(e,a){return o(void 0,void 0,void 0,function(){var t;return n(this,function(r){switch(r.label){case 0:return[4,i(()=>import("./allPaths-CWDYwlGf.js"),__vite__mapDeps([0,1,2,3,4]))];case 1:return t=r.sent().getIconPaths,[2,t(e,a)]}})})};export{_ as allPathsLoader};