ttnn-visualizer 0.25.1__py3-none-any.whl → 0.27.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 (25) hide show
  1. ttnn_visualizer/app.py +32 -5
  2. ttnn_visualizer/csv_queries.py +20 -4
  3. ttnn_visualizer/decorators.py +6 -6
  4. ttnn_visualizer/exceptions.py +7 -0
  5. ttnn_visualizer/file_uploads.py +7 -0
  6. ttnn_visualizer/models.py +21 -12
  7. ttnn_visualizer/queries.py +5 -5
  8. ttnn_visualizer/sessions.py +95 -40
  9. ttnn_visualizer/settings.py +1 -1
  10. ttnn_visualizer/sockets.py +17 -17
  11. ttnn_visualizer/static/assets/{allPaths-BsZhgQ3T.js → allPaths-DfvpbqXZ.js} +1 -1
  12. ttnn_visualizer/static/assets/{allPathsLoader-DgFQ6cmn.js → allPathsLoader-C1wkx2sM.js} +2 -2
  13. ttnn_visualizer/static/assets/{index-C6f3UdbP.css → index-BTfoVg9a.css} +2 -2
  14. ttnn_visualizer/static/assets/{index-Fd4wdmZt.js → index-CeYOVqR1.js} +247 -247
  15. ttnn_visualizer/static/assets/{splitPathsBySizeLoader-BFDp4kIf.js → splitPathsBySizeLoader-C_Kuh9CJ.js} +1 -1
  16. ttnn_visualizer/static/index.html +3 -3
  17. ttnn_visualizer/utils.py +6 -0
  18. ttnn_visualizer/views.py +73 -32
  19. {ttnn_visualizer-0.25.1.dist-info → ttnn_visualizer-0.27.0.dist-info}/METADATA +6 -9
  20. {ttnn_visualizer-0.25.1.dist-info → ttnn_visualizer-0.27.0.dist-info}/RECORD +25 -25
  21. {ttnn_visualizer-0.25.1.dist-info → ttnn_visualizer-0.27.0.dist-info}/LICENSE +0 -0
  22. {ttnn_visualizer-0.25.1.dist-info → ttnn_visualizer-0.27.0.dist-info}/LICENSE_understanding.txt +0 -0
  23. {ttnn_visualizer-0.25.1.dist-info → ttnn_visualizer-0.27.0.dist-info}/WHEEL +0 -0
  24. {ttnn_visualizer-0.25.1.dist-info → ttnn_visualizer-0.27.0.dist-info}/entry_points.txt +0 -0
  25. {ttnn_visualizer-0.25.1.dist-info → ttnn_visualizer-0.27.0.dist-info}/top_level.txt +0 -0
@@ -1 +1 @@
1
- import{_ as o,a as _,b as i,p as c,I as u}from"./index-Fd4wdmZt.js";var p=function(n,s){return o(void 0,void 0,void 0,function(){var a,r;return _(this,function(e){switch(e.label){case 0:return a=c(n),s!==u.STANDARD?[3,2]:[4,i(()=>import("./index-BVMreIQm.js").then(t=>t.I),[])];case 1:return r=e.sent(),[3,4];case 2:return[4,i(()=>import("./index-Do7YB6C4.js").then(t=>t.I),[])];case 3:r=e.sent(),e.label=4;case 4:return[2,r[a]]}})})};export{p as splitPathsBySizeLoader};
1
+ import{_ as o,a as _,b as i,p as c,I as u}from"./index-CeYOVqR1.js";var p=function(n,s){return o(void 0,void 0,void 0,function(){var a,r;return _(this,function(e){switch(e.label){case 0:return a=c(n),s!==u.STANDARD?[3,2]:[4,i(()=>import("./index-BVMreIQm.js").then(t=>t.I),[])];case 1:return r=e.sent(),[3,4];case 2:return[4,i(()=>import("./index-Do7YB6C4.js").then(t=>t.I),[])];case 3:r=e.sent(),e.label=4;case 4:return[2,r[a]]}})})};export{p as splitPathsBySizeLoader};
@@ -6,7 +6,7 @@
6
6
  name="viewport"
7
7
  content="width=device-width, initial-scale=1.0"
8
8
  />
9
- <title>TTNN Visualizer</title>
9
+ <title>TT-NN Visualizer</title>
10
10
 
11
11
  <link
12
12
  rel="icon"
@@ -27,8 +27,8 @@
27
27
  name="theme-color"
28
28
  content="#33333d"
29
29
  />
30
- <script type="module" crossorigin src="/assets/index-Fd4wdmZt.js"></script>
31
- <link rel="stylesheet" crossorigin href="/assets/index-C6f3UdbP.css">
30
+ <script type="module" crossorigin src="/assets/index-CeYOVqR1.js"></script>
31
+ <link rel="stylesheet" crossorigin href="/assets/index-BTfoVg9a.css">
32
32
  </head>
33
33
  <body>
34
34
  <div id="root"></div>
ttnn_visualizer/utils.py CHANGED
@@ -106,6 +106,12 @@ def get_report_path(active_report, current_app, remote_connection=None):
106
106
  else:
107
107
  return ""
108
108
 
109
+ def get_npe_path(npe_name, current_app):
110
+ local_dir = Path(current_app.config["LOCAL_DATA_DIRECTORY"])
111
+
112
+ npe_path = local_dir / "npe"
113
+
114
+ return str(npe_path)
109
115
 
110
116
  def read_last_synced_file(directory: str) -> Optional[int]:
111
117
  """Reads the '.last-synced' file in the specified directory and returns the timestamp as an integer, or None if not found."""
ttnn_visualizer/views.py CHANGED
@@ -21,6 +21,7 @@ from ttnn_visualizer.enums import ConnectionTestStates
21
21
  from ttnn_visualizer.exceptions import RemoteConnectionException
22
22
  from ttnn_visualizer.file_uploads import (
23
23
  extract_report_name,
24
+ extract_npe_name,
24
25
  save_uploaded_files,
25
26
  validate_files,
26
27
  )
@@ -28,7 +29,7 @@ from ttnn_visualizer.models import (
28
29
  RemoteReportFolder,
29
30
  RemoteConnection,
30
31
  StatusMessage,
31
- TabSession,
32
+ Instance,
32
33
  )
33
34
  from ttnn_visualizer.queries import DatabaseQueries
34
35
  from ttnn_visualizer.remote_sqlite_setup import get_sqlite_path, check_sqlite_path
@@ -42,7 +43,7 @@ from ttnn_visualizer.serializers import (
42
43
  serialize_devices,
43
44
  )
44
45
  from ttnn_visualizer.sessions import (
45
- update_tab_session,
46
+ update_instance,
46
47
  )
47
48
  from ttnn_visualizer.sftp_operations import (
48
49
  sync_remote_folders,
@@ -175,7 +176,7 @@ def operation_detail(operation_id, session):
175
176
  )
176
177
  @with_session
177
178
  @timer
178
- def operation_history(session: TabSession):
179
+ def operation_history(session: Instance):
179
180
  operation_history_filename = "operation_history.json"
180
181
  if session.remote_connection and session.remote_connection.useRemoteQuerying:
181
182
  if not session.remote_folder:
@@ -202,7 +203,7 @@ def operation_history(session: TabSession):
202
203
  @api.route("/config")
203
204
  @with_session
204
205
  @timer
205
- def get_config(session: TabSession):
206
+ def get_config(session: Instance):
206
207
  if session.remote_connection and session.remote_connection.useRemoteQuerying:
207
208
  if not session.remote_folder:
208
209
  return {}
@@ -224,7 +225,7 @@ def get_config(session: TabSession):
224
225
  @api.route("/tensors", methods=["GET"])
225
226
  @with_session
226
227
  @timer
227
- def tensors_list(session: TabSession):
228
+ def tensors_list(session: Instance):
228
229
  with DatabaseQueries(session) as db:
229
230
  device_id = request.args.get("device_id", None)
230
231
  tensors = list(db.query_tensors(filters={"device_id": device_id}))
@@ -239,7 +240,7 @@ def tensors_list(session: TabSession):
239
240
  @api.route("/buffer", methods=["GET"])
240
241
  @with_session
241
242
  @timer
242
- def buffer_detail(session: TabSession):
243
+ def buffer_detail(session: Instance):
243
244
  address = request.args.get("address")
244
245
  operation_id = request.args.get("operation_id")
245
246
 
@@ -261,7 +262,7 @@ def buffer_detail(session: TabSession):
261
262
  @api.route("/buffer-pages", methods=["GET"])
262
263
  @with_session
263
264
  @timer
264
- def buffer_pages(session: TabSession):
265
+ def buffer_pages(session: Instance):
265
266
  address = request.args.get("address")
266
267
  operation_id = request.args.get("operation_id")
267
268
  buffer_type = request.args.get("buffer_type", "")
@@ -296,7 +297,7 @@ def buffer_pages(session: TabSession):
296
297
  @api.route("/tensors/<tensor_id>", methods=["GET"])
297
298
  @with_session
298
299
  @timer
299
- def tensor_detail(tensor_id, session: TabSession):
300
+ def tensor_detail(tensor_id, session: Instance):
300
301
  with DatabaseQueries(session) as db:
301
302
  tensors = list(db.query_tensors(filters={"tensor_id": tensor_id}))
302
303
  if not tensors:
@@ -307,7 +308,7 @@ def tensor_detail(tensor_id, session: TabSession):
307
308
 
308
309
  @api.route("/operation-buffers", methods=["GET"])
309
310
  @with_session
310
- def get_operations_buffers(session: TabSession):
311
+ def get_operations_buffers(session: Instance):
311
312
  buffer_type = request.args.get("buffer_type", "")
312
313
  device_id = request.args.get("device_id", None)
313
314
  if buffer_type and str.isdigit(buffer_type):
@@ -327,7 +328,7 @@ def get_operations_buffers(session: TabSession):
327
328
 
328
329
  @api.route("/operation-buffers/<operation_id>", methods=["GET"])
329
330
  @with_session
330
- def get_operation_buffers(operation_id, session: TabSession):
331
+ def get_operation_buffers(operation_id, session: Instance):
331
332
  buffer_type = request.args.get("buffer_type", "")
332
333
  device_id = request.args.get("device_id", None)
333
334
  if buffer_type and str.isdigit(buffer_type):
@@ -356,7 +357,7 @@ def get_operation_buffers(operation_id, session: TabSession):
356
357
 
357
358
  @api.route("/profiler/device-log", methods=["GET"])
358
359
  @with_session
359
- def get_profiler_data(session: TabSession):
360
+ def get_profiler_data(session: Instance):
360
361
  if not session.profiler_path:
361
362
  return Response(status=HTTPStatus.NOT_FOUND)
362
363
  with DeviceLogProfilerQueries(session) as csv:
@@ -366,7 +367,7 @@ def get_profiler_data(session: TabSession):
366
367
 
367
368
  @api.route("/profiler/perf-results", methods=["GET"])
368
369
  @with_session
369
- def get_profiler_performance_data(session: TabSession):
370
+ def get_profiler_performance_data(session: Instance):
370
371
  if not session.profiler_path:
371
372
  return Response(status=HTTPStatus.NOT_FOUND)
372
373
  with OpsPerformanceQueries(session) as csv:
@@ -377,7 +378,7 @@ def get_profiler_performance_data(session: TabSession):
377
378
 
378
379
  @api.route("/profiler/perf-results/raw", methods=["GET"])
379
380
  @with_session
380
- def get_profiler_perf_results_data_raw(session: TabSession):
381
+ def get_profiler_perf_results_data_raw(session: Instance):
381
382
  if not session.profiler_path:
382
383
  return Response(status=HTTPStatus.NOT_FOUND)
383
384
  content = OpsPerformanceQueries.get_raw_csv(session)
@@ -390,7 +391,7 @@ def get_profiler_perf_results_data_raw(session: TabSession):
390
391
 
391
392
  @api.route("/profiler/perf-results/report", methods=["GET"])
392
393
  @with_session
393
- def get_profiler_perf_results_report(session: TabSession):
394
+ def get_profiler_perf_results_report(session: Instance):
394
395
  if not session.profiler_path:
395
396
  return Response(status=HTTPStatus.NOT_FOUND)
396
397
 
@@ -404,7 +405,7 @@ def get_profiler_perf_results_report(session: TabSession):
404
405
 
405
406
  @api.route("/profiler/device-log/raw", methods=["GET"])
406
407
  @with_session
407
- def get_profiler_data_raw(session: TabSession):
408
+ def get_profiler_data_raw(session: Instance):
408
409
  if not session.profiler_path:
409
410
  return Response(status=HTTPStatus.NOT_FOUND)
410
411
  content = DeviceLogProfilerQueries.get_raw_csv(session)
@@ -417,7 +418,7 @@ def get_profiler_data_raw(session: TabSession):
417
418
 
418
419
  @api.route("/profiler/device-log/zone/<zone>", methods=["GET"])
419
420
  @with_session
420
- def get_zone_statistics(zone, session: TabSession):
421
+ def get_zone_statistics(zone, session: Instance):
421
422
  if not session.profiler_path:
422
423
  return Response(status=HTTPStatus.NOT_FOUND)
423
424
  with DeviceLogProfilerQueries(session) as csv:
@@ -427,7 +428,7 @@ def get_zone_statistics(zone, session: TabSession):
427
428
 
428
429
  @api.route("/devices", methods=["GET"])
429
430
  @with_session
430
- def get_devices(session: TabSession):
431
+ def get_devices(session: Instance):
431
432
  with DatabaseQueries(session) as db:
432
433
  devices = list(db.query_devices())
433
434
  return serialize_devices(devices)
@@ -449,19 +450,18 @@ def create_report_files():
449
450
 
450
451
  save_uploaded_files(files, report_directory, report_name)
451
452
 
452
- tab_id = request.args.get("tabId")
453
- update_tab_session(tab_id=tab_id, report_name=report_name, clear_remote=True)
453
+ instance_id = request.args.get("instanceId")
454
+ update_instance(instance_id=instance_id, report_name=report_name, clear_remote=True)
454
455
 
455
456
  return StatusMessage(
456
457
  status=ConnectionTestStates.OK, message="Success."
457
458
  ).model_dump()
458
459
 
459
-
460
460
  @api.route("/local/upload/profile", methods=["POST"])
461
461
  def create_profile_files():
462
462
  files = request.files.getlist("files")
463
463
  report_directory = Path(current_app.config["LOCAL_DATA_DIRECTORY"])
464
- tab_id = request.args.get("tabId")
464
+ instance_id = request.args.get("instanceId")
465
465
 
466
466
  if not validate_files(
467
467
  files,
@@ -498,8 +498,8 @@ def create_profile_files():
498
498
  str(report_directory),
499
499
  )
500
500
 
501
- update_tab_session(
502
- tab_id=tab_id, profile_name=profiler_folder_name, clear_remote=True
501
+ update_instance(
502
+ instance_id=instance_id, profile_name=profiler_folder_name, clear_remote=True
503
503
  )
504
504
 
505
505
  return StatusMessage(
@@ -507,6 +507,31 @@ def create_profile_files():
507
507
  ).model_dump()
508
508
 
509
509
 
510
+ @api.route("/local/upload/npe", methods=["POST"])
511
+ def create_npe_files():
512
+ files = request.files.getlist("files")
513
+ report_directory = current_app.config["LOCAL_DATA_DIRECTORY"]
514
+
515
+ for file in files:
516
+ if not file.filename.endswith(".json"):
517
+ return StatusMessage(
518
+ status=ConnectionTestStates.FAILED,
519
+ message="NPE requires a valid JSON file",
520
+ ).model_dump()
521
+
522
+ npe_name = extract_npe_name(files)
523
+ target_directory = report_directory / "npe"
524
+ target_directory.mkdir(parents=True, exist_ok=True)
525
+
526
+ save_uploaded_files(files, target_directory, npe_name)
527
+
528
+ instance_id = request.args.get("instanceId")
529
+ update_instance(instance_id=instance_id, npe_name=npe_name, clear_remote=True)
530
+
531
+ return StatusMessage(
532
+ status=ConnectionTestStates.OK, message="Success"
533
+ ).model_dump()
534
+
510
535
  @api.route("/remote/folder", methods=["POST"])
511
536
  def get_remote_folders():
512
537
  connection = RemoteConnection.model_validate(request.json, strict=False)
@@ -570,7 +595,7 @@ import yaml
570
595
 
571
596
  @api.route("/cluster_desc", methods=["GET"])
572
597
  @with_session
573
- def get_cluster_description_file(session: TabSession):
598
+ def get_cluster_description_file(session: Instance):
574
599
  if not session.remote_connection:
575
600
  return jsonify({"error": "Remote connection not found"}), 404
576
601
 
@@ -670,7 +695,7 @@ def sync_remote_folder():
670
695
 
671
696
  folder = request_body.get("folder")
672
697
  profile = request_body.get("profile", None)
673
- tab_id = request.args.get("tabId", None)
698
+ instance_id = request.args.get("instanceId", None)
674
699
  connection = RemoteConnection.model_validate(
675
700
  request_body.get("connection"), strict=False
676
701
  )
@@ -683,7 +708,7 @@ def sync_remote_folder():
683
708
  remote_dir,
684
709
  profile=profile_folder,
685
710
  exclude_patterns=[r"/tensors(/|$)"],
686
- sid=tab_id,
711
+ sid=instance_id,
687
712
  )
688
713
 
689
714
  profile_folder.lastSynced = int(time.time())
@@ -701,7 +726,7 @@ def sync_remote_folder():
701
726
  remote_folder.remotePath,
702
727
  remote_dir,
703
728
  exclude_patterns=[r"/tensors(/|$)"],
704
- sid=tab_id,
729
+ sid=instance_id,
705
730
  )
706
731
 
707
732
  remote_folder.lastSynced = int(time.time())
@@ -767,11 +792,11 @@ def use_remote_folder():
767
792
 
768
793
  remote_path = f"{Path(report_data_directory).name}/{connection.host}/{connection_directory.name}"
769
794
 
770
- tab_id = request.args.get("tabId")
771
- current_app.logger.info(f"Setting active report for {tab_id} - {remote_path}")
795
+ instance_id = request.args.get("instanceId")
796
+ current_app.logger.info(f"Setting active report for {instance_id} - {remote_path}")
772
797
 
773
- update_tab_session(
774
- tab_id=tab_id,
798
+ update_instance(
799
+ instance_id=instance_id,
775
800
  report_name=report_folder,
776
801
  profile_name=profile_name,
777
802
  remote_connection=connection,
@@ -789,6 +814,22 @@ def health_check():
789
814
 
790
815
  @api.route("/session", methods=["GET"])
791
816
  @with_session
792
- def get_tab_session(session: TabSession):
817
+ def get_instance(session: Instance):
793
818
  # Used to gate UI functions if no report is active
794
819
  return session.model_dump()
820
+
821
+ @api.route("/npe", methods=["GET"])
822
+ @with_session
823
+ @timer
824
+ def get_npe_data(session: Instance):
825
+ if not session.npe_path:
826
+ logger.error("NPE path is not set in the session.")
827
+ return Response(status=HTTPStatus.NOT_FOUND)
828
+
829
+ npe_file = Path(f"{session.npe_path}/{session.active_report.npe_name}.json")
830
+ if not npe_file.exists():
831
+ logger.error(f"NPE file does not exist: {npe_file}")
832
+ return Response(status=HTTPStatus.NOT_FOUND)
833
+ with open(npe_file, "r") as file:
834
+ npe_data = json.load(file)
835
+ return jsonify(npe_data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ttnn_visualizer
3
- Version: 0.25.1
3
+ Version: 0.27.0
4
4
  Summary: TT Visualizer
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -57,10 +57,11 @@ TT-NN Visualizer can be installed from PyPI:
57
57
 
58
58
  After installation run `ttnn-visualizer` to start the application.
59
59
 
60
- It is recommended to do this within a virtual environment. The minimum Python version is 3.10.
60
+ It is recommended to do this within a virtual environment. The minimum Python version is **3.10**.
61
61
 
62
- Please see the [getting started](https://github.com/tenstorrent/ttnn-visualizer/blob/main/docs/getting-started.md) guide
63
- for further information on getting up and running with TT-NN Visualizer.
62
+ Please see the [getting started](https://github.com/tenstorrent/ttnn-visualizer/blob/main/docs/getting-started.md) guide for further information on getting up and running with TT-NN Visualizer.
63
+
64
+ If you want to test out TT-NN Visualizer you can try some of the [sample data](https://github.com/tenstorrent/ttnn-visualizer/tree/main?tab=readme-ov-file#sample-reports). See [loading data](https://github.com/tenstorrent/ttnn-visualizer/blob/main/docs/getting-started.md#loading-data) for instructions on how to use this.
64
65
 
65
66
  ## Features
66
67
 
@@ -86,7 +87,7 @@ For the latest updates and features, please see [releases](https://github.com/te
86
87
 
87
88
  https://github.com/user-attachments/assets/d00a2629-0bd1-4ee1-bb12-bd796d85221d
88
89
 
89
- | L1 Summary with Tensor highlight | Operation inputs and ouputs |
90
+ | L1 Summary with Tensor highlight | Operation inputs and outputs |
90
91
  |-----------------------------------------------|------------------------------------------|
91
92
  | <img width="400" alt="L1 Summary with Tensor highlight" src="https://github.com/user-attachments/assets/73c0aff8-16b2-4d1e-85a8-81c434012d36" /> | <img width="400" alt="Operation inputs and outputs" src="https://github.com/user-attachments/assets/e9480ad2-7e24-436b-932b-050c6b489516" /> |
92
93
 
@@ -114,10 +115,6 @@ https://github.com/user-attachments/assets/d00a2629-0bd1-4ee1-bb12-bd796d85221d
114
115
  |-----------------------------------------------|------------------------------------------|
115
116
  | <img width="400" alt="NPE" src="https://github.com/user-attachments/assets/1f4441c6-9d9e-4834-9e71-edec1955243c" /> | <img width="400" alt="NPE" src="https://github.com/user-attachments/assets/7159992e-7691-41cf-a152-8bc6a3606ade" /> |
116
117
 
117
- ## Remote Querying
118
-
119
- Use [remote querying](https://github.com/tenstorrent/ttnn-visualizer/blob/main/docs/remote-querying.md) instead of syncing the report data to your local file system.
120
-
121
118
  ## Sample reports
122
119
 
123
120
  You may test the application using the following sample reports.
@@ -1,34 +1,34 @@
1
1
  ttnn_visualizer/__init__.py,sha256=qn9AwfHTxYYK0Icz-q2Q41Xo9ET6oc6anZzgh02PhK4,94
2
- ttnn_visualizer/app.py,sha256=wpNtTizfgKg5hp-pQm0LaRQ1OW2aFy2kYBb5xxRms2M,5186
3
- ttnn_visualizer/csv_queries.py,sha256=MH4ViAhwCSEGPWIrQ5HH0lFjiPLwFRzxLSX9g1oP5ak,20891
4
- ttnn_visualizer/decorators.py,sha256=XKGByL3_CUwuoU93CcRaFFT8VOK3N6X5UOgK0umy6_A,4218
2
+ ttnn_visualizer/app.py,sha256=vTcZ6DfTVXpTQCwHTlrQuIK1_WHhDpKGBSv69ZeVosY,6279
3
+ ttnn_visualizer/csv_queries.py,sha256=AqyyxTU4ZvbNiZNBWepsBWa8709z2H-J1DFEGaM7ywE,21451
4
+ ttnn_visualizer/decorators.py,sha256=zfvDqeUkzeFJq0RApByl1utdv2EAh-ij4YBqheBknsU,4252
5
5
  ttnn_visualizer/enums.py,sha256=XTWZGvPFtKmIhPXGCbbzi6bxFgRpLrAZGrrR5YvGYjY,203
6
- ttnn_visualizer/exceptions.py,sha256=iATY-bfcSQL1Af4aLSN2d0fLD5NcS19NKwoB3JyLp4A,960
6
+ ttnn_visualizer/exceptions.py,sha256=tl3WvS_6mVCFixN_elFUeypV51trVuKVcM36D2svEbE,1055
7
7
  ttnn_visualizer/extensions.py,sha256=jovwo_j9toJVuXDVq4iPpXJMRXPpzSliNpE1TOJMDHI,380
8
- ttnn_visualizer/file_uploads.py,sha256=VV1y8AlNlY5SiG64hGGYwzzOh1qw0-TRAP_o1lsKFJ4,2468
9
- ttnn_visualizer/models.py,sha256=7O96nIVlHrNjaX6-d_KL_Tv0B9Syi_XpLqQzcws1lfg,7230
10
- ttnn_visualizer/queries.py,sha256=eQTRrdGlfKdKuZuNQXM6Awn3w4mkDhynzxf1JHyZiDg,13626
8
+ ttnn_visualizer/file_uploads.py,sha256=s7gKQVpc2j1qFKY_AOYr9yoISjjUer5FjvsZyQZ_1P0,2603
9
+ ttnn_visualizer/models.py,sha256=fsokoPLzjTLlaaG0gi5xzRWBhuCmvUOgeQFMpc1ocPc,7585
10
+ ttnn_visualizer/queries.py,sha256=oifyj_ROmQwUkQCFO1SteuphaoZbROcnizG1ix-1r3U,13616
11
11
  ttnn_visualizer/remote_sqlite_setup.py,sha256=Zd7U7q_N92rD0P2qb1GIXuZjhV4LXqfq7Bhg0MTLS5k,3269
12
12
  ttnn_visualizer/requirements.txt,sha256=LiycuPs-Oh8PZ1qM6v1KlUPQG86nQyQFz_x7dU8DSpA,370
13
13
  ttnn_visualizer/serializers.py,sha256=smY3CgbqaAXsovoYZ-A9fgPXih5lUS2HD_3aIZMcFS4,7821
14
- ttnn_visualizer/sessions.py,sha256=2Xh77mZy8-nDDQ7A7OeeGqYMKiBOzMiHdQjXmYUInqU,7082
15
- ttnn_visualizer/settings.py,sha256=WwAG9aVYBe9iSySWnjBtZsYjKaTfUiJZPwT5WIm4Lt8,3841
14
+ ttnn_visualizer/sessions.py,sha256=saH4-ePXitXJzr1GvA_G-lrYxpx0Dk2gZ8DNoTlPgYU,8788
15
+ ttnn_visualizer/settings.py,sha256=kC0mBNrZDq1S7RPeRGnPcGZxGuM515A1upsWRrKl5k8,3841
16
16
  ttnn_visualizer/sftp_operations.py,sha256=RrzCGo__2sQ2g4r90qlyFBEq4v6ooX2ntJ7VDKuynC0,17659
17
- ttnn_visualizer/sockets.py,sha256=gpLZiZFpmHz_bfNkrYOU_op4-tQrT0YNYDKk77jrgow,3509
17
+ ttnn_visualizer/sockets.py,sha256=o0oTG26LCjTJL8ajHR28ZBp9Z8RfWDehaS8Orns1HoQ,3624
18
18
  ttnn_visualizer/ssh_client.py,sha256=KRLuIk6wxrZZQUQKfC8QWMhXGJQvfKKeyxLThgRX6ak,2679
19
- ttnn_visualizer/utils.py,sha256=NUxjGtxCcEDCAWIYYMYVPp1o8HO4KwXnTOQGXSw2JSo,6206
20
- ttnn_visualizer/views.py,sha256=82H4TNb9i_ugYeCCzXoiN7mhi_8giNBwzJmqamw6poc,26498
19
+ ttnn_visualizer/utils.py,sha256=zD8_B7Dd8sgOQF52LNQ5HrLxuvfZg-YnxLrZOpuA5Lw,6372
20
+ ttnn_visualizer/views.py,sha256=nYpWsXnBG6yQEoBYcQk-nrdDFUIsYiYoV8ibSw1h960,27986
21
21
  ttnn_visualizer/bin/docker-entrypoint-web,sha256=uuv6aubpMCfOcuvDBxwBDITE8PN39teuwyJ2zA5KWuw,413
22
22
  ttnn_visualizer/bin/pip3-install,sha256=nbSRT4GfJQIQ9KTNO3j-6b5WM4lrx9XA4GBlAURRMws,502
23
- ttnn_visualizer/static/index.html,sha256=xBtmTE_2K_QxAxJdbrAE5gLlbQZmrgiEDSI0m48O8yE,922
24
- ttnn_visualizer/static/assets/allPaths-BsZhgQ3T.js,sha256=R6YPoJ9v_Ofms6zByrH1BU4UDPQK325KqH6YGM1lUFE,309
25
- ttnn_visualizer/static/assets/allPathsLoader-DgFQ6cmn.js,sha256=HwsPqMthZPAbjGni9ebzDpZY6WE9tE45kCw2X7-fjls,550
23
+ ttnn_visualizer/static/index.html,sha256=SxpwihJ2A01wnUwkg6ozH8duXxciJmmyDIs6csdoWXc,923
24
+ ttnn_visualizer/static/assets/allPaths-DfvpbqXZ.js,sha256=mlrmIupcMQ0flCfpqrtQ-3x8bBolyDmy7zOVvq725OY,309
25
+ ttnn_visualizer/static/assets/allPathsLoader-C1wkx2sM.js,sha256=sIypA5lMRhOnuhYis-PC_CHwOpTZNVmCWoVvaU2RXSk,550
26
+ ttnn_visualizer/static/assets/index-BTfoVg9a.css,sha256=3Ft7KsW9G6k2DYkHJvRwadGpYzSjTPVBAetC0r5xnVQ,615889
26
27
  ttnn_visualizer/static/assets/index-BVMreIQm.js,sha256=QJTBb4VVCMoLPYsWdru3heJX1VtMJQYJGx-tq8gZNTw,280965
27
- ttnn_visualizer/static/assets/index-C6f3UdbP.css,sha256=IUhjRkmhDOJ6qIkduTxONW6_D_6NLr7FmENQwpNjbAE,614348
28
+ ttnn_visualizer/static/assets/index-CeYOVqR1.js,sha256=EE7mCKhj-f_gbmEJhlPpiNPNvnPrYtF4gEsFa8ZsDn0,6985407
28
29
  ttnn_visualizer/static/assets/index-Do7YB6C4.js,sha256=10jCIy7zph8mPB2htGfhXJBV7LO2FFrGhfz7xoQyh00,289378
29
- ttnn_visualizer/static/assets/index-Fd4wdmZt.js,sha256=U1QMm-Wr1f4zUePl7Q3ia6FK7EbZ0F1on0S4iwnPfUQ,6980268
30
30
  ttnn_visualizer/static/assets/site-BTBrvHC5.webmanifest,sha256=Uy_XmnGuYFVf-OZuma2NvgEPdrCrevb3HZvaxSIHoA0,456
31
- ttnn_visualizer/static/assets/splitPathsBySizeLoader-BFDp4kIf.js,sha256=_DXD2ZBrwyZHKU-_u6cBAo2JLE8kYCs3BzodTV5vlls,472
31
+ ttnn_visualizer/static/assets/splitPathsBySizeLoader-C_Kuh9CJ.js,sha256=Ips02EyFWciDCreb3_HkMZ2F3SPgaLxPOzUw93Vsnmo,472
32
32
  ttnn_visualizer/static/favicon/android-chrome-192x192.png,sha256=BZWA09Zxaa3fXbaeS6nhWo2e-DUSjm9ElzNQ_xTB5XU,6220
33
33
  ttnn_visualizer/static/favicon/android-chrome-512x512.png,sha256=HBiJSZyguB3o8fMJuqIGcpeBy_9JOdImme3wD02UYCw,62626
34
34
  ttnn_visualizer/static/favicon/favicon-32x32.png,sha256=Zw201qUsczQv1UvoQvJf5smQ2ss10xaTeWxmQNYCGtY,480
@@ -37,10 +37,10 @@ ttnn_visualizer/static/sample-data/cluster-desc.yaml,sha256=LMxOmsRUXtVVU5ogzYkX
37
37
  ttnn_visualizer/tests/__init__.py,sha256=qn9AwfHTxYYK0Icz-q2Q41Xo9ET6oc6anZzgh02PhK4,94
38
38
  ttnn_visualizer/tests/test_queries.py,sha256=OoINMZezyJkpiQuM1Owp4DlMoJGTl6OgsUbPa2Rxqc0,16546
39
39
  ttnn_visualizer/tests/test_serializers.py,sha256=966AJkXLAwzsceSQ9QR-Sy7VrEbE71AtfMF3y9ZIIWc,18490
40
- ttnn_visualizer-0.25.1.dist-info/LICENSE,sha256=7_uV4foXIbLyroI1M6NdIySajtLuPwayZr1UN2ItErI,11353
41
- ttnn_visualizer-0.25.1.dist-info/LICENSE_understanding.txt,sha256=pymi-yb_RvYM9p2ZA4iSNsImcvhDBBxlGuJCY9dTq7M,233
42
- ttnn_visualizer-0.25.1.dist-info/METADATA,sha256=6P5GLU4CUpp-tt2puqP0cffaihGvy8fhulWtzvDmuSM,7155
43
- ttnn_visualizer-0.25.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
44
- ttnn_visualizer-0.25.1.dist-info/entry_points.txt,sha256=QpuUpkmQ_mEHJTMqOBdU0MH2Z4WF_9iFsGACeyyAO1E,61
45
- ttnn_visualizer-0.25.1.dist-info/top_level.txt,sha256=M1EGkvDOuIfbhDbcUdz2-TSdmCtDoQ2Uyag9k5JLDSY,16
46
- ttnn_visualizer-0.25.1.dist-info/RECORD,,
40
+ ttnn_visualizer-0.27.0.dist-info/LICENSE,sha256=7_uV4foXIbLyroI1M6NdIySajtLuPwayZr1UN2ItErI,11353
41
+ ttnn_visualizer-0.27.0.dist-info/LICENSE_understanding.txt,sha256=pymi-yb_RvYM9p2ZA4iSNsImcvhDBBxlGuJCY9dTq7M,233
42
+ ttnn_visualizer-0.27.0.dist-info/METADATA,sha256=b9ogJbUbZDs1H_XkgLMq7oXboCq-4sVWNITxg6ryNY8,7297
43
+ ttnn_visualizer-0.27.0.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
44
+ ttnn_visualizer-0.27.0.dist-info/entry_points.txt,sha256=QpuUpkmQ_mEHJTMqOBdU0MH2Z4WF_9iFsGACeyyAO1E,61
45
+ ttnn_visualizer-0.27.0.dist-info/top_level.txt,sha256=M1EGkvDOuIfbhDbcUdz2-TSdmCtDoQ2Uyag9k5JLDSY,16
46
+ ttnn_visualizer-0.27.0.dist-info/RECORD,,