najaeda 0.1.24__cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl → 0.2.0__cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.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.

Potentially problematic release.


This version of najaeda might be problematic. Click here for more details.

@@ -23,8 +23,7 @@ With **najaeda**, it is possible to:
23
23
  * **Prototype EDA Ideas Quickly**:
24
24
  * Use an intuitive API to experiment with new EDA concepts and workflows.
25
25
  * **Develop Custom EDA Tools**:
26
- * Build fast, tailored tools for solving specific challenges
27
- without relying on costly, proprietary EDA software.
26
+ * Build fast, tailored tools for solving specific challenges without relying on costly, proprietary EDA software.
28
27
 
29
28
  **najaeda** empowers developers to innovate, adapt, and accelerate
30
29
  their EDA processes with minimal overhead.
@@ -34,6 +33,15 @@ Information about the **najaeda** PyPI package is available at https://pypi.org/
34
33
  If you want more details about the underlying **naja** C++ library,
35
34
  please visit the **naja** GitHub repository at https://github.com/najaeda/naja .
36
35
 
36
+ Quick Start
37
+ ===========
38
+
39
+ To get started with **najaeda**, try out the interactive notebook in Google Colab:
40
+
41
+ .. image:: https://colab.research.google.com/assets/colab-badge.svg
42
+ :target: https://colab.research.google.com/github/najaeda/najaeda-tutorials/blob/main/notebooks/01_getting_started.ipynb
43
+ :alt: Open in Colab
44
+
37
45
  Installation
38
46
  ------------
39
47
  **najaeda** can be easily installed using pip:
najaeda/libnaja_bne.so CHANGED
Binary file
najaeda/libnaja_nl.so CHANGED
Binary file
najaeda/libnaja_opt.so CHANGED
Binary file
najaeda/libnaja_python.so CHANGED
Binary file
najaeda/naja.so CHANGED
Binary file
najaeda/netlist.py CHANGED
@@ -12,6 +12,7 @@ import sys
12
12
  import os
13
13
  from enum import Enum
14
14
  from typing import Union, List
15
+ from dataclasses import dataclass
15
16
 
16
17
  from najaeda import naja
17
18
 
@@ -428,9 +429,11 @@ def get_snl_term_for_ids_with_path(path, termIDs):
428
429
 
429
430
 
430
431
  class Term:
431
- INPUT = naja.SNLTerm.Direction.Input
432
- OUTPUT = naja.SNLTerm.Direction.Output
433
- INOUT = naja.SNLTerm.Direction.InOut
432
+ class Direction(Enum):
433
+ """Enum for the direction of a term."""
434
+ INPUT = naja.SNLTerm.Direction.Input
435
+ OUTPUT = naja.SNLTerm.Direction.Output
436
+ INOUT = naja.SNLTerm.Direction.InOut
434
437
 
435
438
  def __init__(self, path, term):
436
439
  # self.termIDs = []
@@ -472,16 +475,18 @@ class Term:
472
475
  def __str__(self):
473
476
  term_str = ""
474
477
  path = get_snl_path_from_id_list(self.pathIDs)
478
+ snl_term = get_snl_term_for_ids(self.pathIDs, self.termIDs)
479
+ snl_term_str = snl_term.getName()
480
+ if snl_term.isUnnamed():
481
+ snl_term_str = "<unnamed>"
475
482
  if path.size() == 0:
476
- term_str = get_snl_term_for_ids(self.pathIDs, self.termIDs).getName()
483
+ term_str = snl_term_str
477
484
  else:
478
- term_str = (
479
- f"{path}/{get_snl_term_for_ids(self.pathIDs, self.termIDs).getName()}"
480
- )
485
+ term_str = f"{path}/{snl_term_str}"
481
486
  if self.is_bus():
482
487
  term_str += f"[{self.get_msb()}:{self.get_lsb()}]"
483
488
  elif self.is_bus_bit():
484
- term_str += f"[{self.get_lsb()}]"
489
+ term_str += f"[{self.get_msb()}]"
485
490
  return term_str
486
491
 
487
492
  def __repr__(self) -> str:
@@ -571,18 +576,18 @@ class Term:
571
576
  """
572
577
  return get_snl_term_for_ids(self.pathIDs, self.termIDs).getName()
573
578
 
574
- def get_direction(self) -> naja.SNLTerm.Direction:
579
+ def get_direction(self) -> Direction:
575
580
  """
576
581
  :return: the direction of the term.
577
- :rtype: naja.SNLTerm.Direction
582
+ :rtype: Term.Direction
578
583
  """
579
584
  snlterm = get_snl_term_for_ids(self.pathIDs, self.termIDs)
580
585
  if snlterm.getDirection() == naja.SNLTerm.Direction.Input:
581
- return Term.INPUT
586
+ return Term.Direction.INPUT
582
587
  elif snlterm.getDirection() == naja.SNLTerm.Direction.Output:
583
- return Term.OUTPUT
588
+ return Term.Direction.OUTPUT
584
589
  elif snlterm.getDirection() == naja.SNLTerm.Direction.InOut:
585
- return Term.INOUT
590
+ return Term.Direction.INOUT
586
591
 
587
592
  def __get_snl_bitnet(self, bit) -> Net:
588
593
  # single bit
@@ -646,6 +651,7 @@ class Term:
646
651
  """
647
652
  :return: the net of the term.
648
653
  :rtype: Net
654
+ :remark: If the term is a top level term, it will return None.
649
655
  """
650
656
  head_path = self.pathIDs.copy()
651
657
  if len(head_path) == 0:
@@ -881,7 +887,7 @@ class Instance:
881
887
  the wire a to the output of the assign and b to the input.
882
888
 
883
889
  :return: True if this is an assign. Assigns are represented with
884
- anonymous Assign instances.
890
+ unnamed Assign instances.
885
891
  :rtype: bool
886
892
  """
887
893
  return self.__get_snl_model().isAssign()
@@ -975,17 +981,25 @@ class Instance:
975
981
  def dump_context_dot(self, path: str):
976
982
  self.__get_snl_model().dumpContextDotFile(path)
977
983
 
978
- def get_child_instance(self, name: str):
984
+ def get_child_instance(self, names: Union[str, list]):
979
985
  """
980
- :param str name: the name of the child Instance to get.
981
- :return: the child Instance with the given name or None if it does not exist.
986
+ :param names: the name of the child instance
987
+ or the path to the child Instance as a list of names.
988
+ :return: the child Instance at the given path or None if it does not exist.
982
989
  :rtype: Instance or None
983
990
  """
984
- childInst = self.__get_snl_model().getInstance(name)
985
- if childInst is None:
986
- return None
991
+ if isinstance(names, str):
992
+ names = [names]
993
+ if not names:
994
+ raise ValueError("Names argument cannot be empty")
995
+ model = self.__get_snl_model()
987
996
  path = self.pathIDs.copy()
988
- path.append(childInst.getID())
997
+ for name in names:
998
+ childInst = model.getInstance(name)
999
+ if childInst is None:
1000
+ return None
1001
+ path.append(childInst.getID())
1002
+ model = childInst.getModel()
989
1003
  return Instance(path)
990
1004
 
991
1005
  def get_child_instances(self):
@@ -1313,11 +1327,11 @@ class Instance:
1313
1327
  path = naja.SNLPath(path, newSNLInstance)
1314
1328
  return Instance(path)
1315
1329
 
1316
- def create_term(self, name: str, direction: naja.SNLTerm.Direction) -> Term:
1330
+ def create_term(self, name: str, direction: Term.Direction) -> Term:
1317
1331
  """Create a Term in this Instance with the given name and direction.
1318
1332
 
1319
1333
  :param str name: the name of the Term to create.
1320
- :param naja.SNLTerm.Direction direction: the direction of the Term to create.
1334
+ :param Term.Direction direction: the direction of the Term to create.
1321
1335
  :return: the created Term.
1322
1336
  """
1323
1337
  path = get_snl_path_from_id_list(self.pathIDs)
@@ -1325,7 +1339,7 @@ class Instance:
1325
1339
  naja.SNLUniquifier(path)
1326
1340
  path = get_snl_path_from_id_list(self.pathIDs)
1327
1341
  design = self.__get_snl_model()
1328
- newSNLTerm = naja.SNLScalarTerm.create(design, direction, name)
1342
+ newSNLTerm = naja.SNLScalarTerm.create(design, direction.value, name)
1329
1343
  return Term(path.getPathIDs(), newSNLTerm)
1330
1344
 
1331
1345
  def create_output_term(self, name: str) -> Term:
@@ -1335,7 +1349,7 @@ class Instance:
1335
1349
  :return: the created Term.
1336
1350
  :rtype: Term
1337
1351
  """
1338
- return self.create_term(name, naja.SNLTerm.Direction.Output)
1352
+ return self.create_term(name, Term.Direction.OUTPUT)
1339
1353
 
1340
1354
  def create_input_term(self, name: str) -> Term:
1341
1355
  """Create an input Term in this Instance with the given name.
@@ -1344,7 +1358,7 @@ class Instance:
1344
1358
  :return: the created Term.
1345
1359
  :rtype: Term
1346
1360
  """
1347
- return self.create_term(name, naja.SNLTerm.Direction.Input)
1361
+ return self.create_term(name, Term.Direction.INPUT)
1348
1362
 
1349
1363
  def create_inout_term(self, name: str) -> Term:
1350
1364
  """Create an inout Term in this Instance with the given name.
@@ -1353,22 +1367,22 @@ class Instance:
1353
1367
  :return: the created Term.
1354
1368
  :rtype: Term
1355
1369
  """
1356
- return self.create_term(name, naja.SNLTerm.Direction.InOut)
1370
+ return self.create_term(name, Term.Direction.INOUT)
1357
1371
 
1358
- def create_bus_term(self, name: str, msb: int, lsb: int, direction) -> Term:
1372
+ def create_bus_term(self, name: str, msb: int, lsb: int, direction: Term.Direction) -> Term:
1359
1373
  """Create a bus Term in this Instance with the given name, msb, lsb and direction.
1360
1374
 
1361
1375
  :param str name: the name of the Term to create.
1362
1376
  :param int msb: the most significant bit of the Term to create.
1363
1377
  :param int lsb: the least significant bit of the Term to create.
1364
- :param naja.SNLTerm.Direction direction: the direction of the Term to create.
1378
+ :param Term.Direction direction: the direction of the Term to create.
1365
1379
  :return: the created Term.
1366
1380
  """
1367
1381
  path = get_snl_path_from_id_list(self.pathIDs)
1368
1382
  if path.size() > 0:
1369
1383
  naja.SNLUniquifier(path)
1370
1384
  design = self.__get_snl_model()
1371
- newSNLTerm = naja.SNLBusTerm.create(design, direction, msb, lsb, name)
1385
+ newSNLTerm = naja.SNLBusTerm.create(design, direction.value, msb, lsb, name)
1372
1386
  return Term(self.pathIDs, newSNLTerm)
1373
1387
 
1374
1388
  def create_inout_bus_term(self, name: str, msb: int, lsb: int) -> Term:
@@ -1380,7 +1394,7 @@ class Instance:
1380
1394
  :return: the created Term.
1381
1395
  :rtype: Term
1382
1396
  """
1383
- return self.create_bus_term(name, msb, lsb, naja.SNLTerm.Direction.InOut)
1397
+ return self.create_bus_term(name, msb, lsb, Term.Direction.INOUT)
1384
1398
 
1385
1399
  def create_output_bus_term(self, name: str, msb: int, lsb: int) -> Term:
1386
1400
  """Create an output bus Term in this Instance with the given name, msb and lsb.
@@ -1391,7 +1405,7 @@ class Instance:
1391
1405
  :return: the created Term.
1392
1406
  :rtype: Term
1393
1407
  """
1394
- return self.create_bus_term(name, msb, lsb, naja.SNLTerm.Direction.Output)
1408
+ return self.create_bus_term(name, msb, lsb, Term.Direction.OUTPUT)
1395
1409
 
1396
1410
  def create_input_bus_term(self, name: str, msb: int, lsb: int) -> Term:
1397
1411
  """Create an input bus Term in this Instance with the given name, msb and lsb.
@@ -1402,7 +1416,7 @@ class Instance:
1402
1416
  :return: the created Term.
1403
1417
  :rtype: Term
1404
1418
  """
1405
- return self.create_bus_term(name, msb, lsb, naja.SNLTerm.Direction.Input)
1419
+ return self.create_bus_term(name, msb, lsb, Term.Direction.INPUT)
1406
1420
 
1407
1421
  def create_net(self, name: str) -> Net:
1408
1422
  """Create a scalar Net in this Instance with the given name.
@@ -1436,13 +1450,21 @@ class Instance:
1436
1450
  newSNLNet = naja.SNLBusNet.create(model, msb, lsb, name)
1437
1451
  return Net(path, newSNLNet)
1438
1452
 
1439
- def dump_verilog(self, path: str, name: str):
1453
+ def dump_verilog(self, path: str):
1440
1454
  """Dump the verilog of this instance.
1441
1455
 
1442
- :param str path: the path where to dump the verilog.
1443
- :param str name: the name of the verilog file.
1456
+ :param str path: the file path where to dump the verilog.
1457
+ :rtype: None
1458
+ :raises ValueError: if the path does not end with .v.
1459
+ :raises FileNotFoundError: if the directory of the path does not exist.
1444
1460
  """
1445
- self.__get_snl_model().dumpVerilog(path, name)
1461
+ # path should be a file path of the form "path/to/file.v"
1462
+ if not path.endswith(".v"):
1463
+ raise ValueError("The path must end with .v")
1464
+ dir_path = os.path.dirname(path) or "."
1465
+ if not os.path.exists(dir_path):
1466
+ raise FileNotFoundError(f"The directory {dir_path} does not exist")
1467
+ self.__get_snl_model().dumpVerilog(dir_path, os.path.basename(path))
1446
1468
 
1447
1469
  def get_truth_table(self):
1448
1470
  """
@@ -1461,6 +1483,15 @@ def __get_top_db() -> naja.NLDB:
1461
1483
  return naja.NLUniverse.get().getTopDB()
1462
1484
 
1463
1485
 
1486
+ def reset():
1487
+ """Reset the environment by deleting everything.
1488
+ :rtype: None
1489
+ """
1490
+ u = naja.NLUniverse.get()
1491
+ if u is not None:
1492
+ u.destroy()
1493
+
1494
+
1464
1495
  def get_top():
1465
1496
  """
1466
1497
  :return: the top Instance.
@@ -1485,9 +1516,10 @@ def create_top(name: str) -> Instance:
1485
1516
  return Instance()
1486
1517
 
1487
1518
 
1519
+ @dataclass
1488
1520
  class VerilogConfig:
1489
- def __init__(self, keep_assigns=True):
1490
- self.keep_assigns = keep_assigns
1521
+ keep_assigns: bool = True
1522
+ allow_unknown_designs: bool = False
1491
1523
 
1492
1524
 
1493
1525
  def load_verilog(files: Union[str, List[str]], config: VerilogConfig = None) -> Instance:
@@ -1496,6 +1528,8 @@ def load_verilog(files: Union[str, List[str]], config: VerilogConfig = None) ->
1496
1528
  :param files: a list of verilog files to load or a single file.
1497
1529
  :param config: the configuration to use when loading the files.
1498
1530
  :return: the top Instance.
1531
+ :rtype: Instance
1532
+ :raises Exception: if no files are provided.
1499
1533
  """
1500
1534
  if isinstance(files, str):
1501
1535
  files = [files]
@@ -1505,7 +1539,11 @@ def load_verilog(files: Union[str, List[str]], config: VerilogConfig = None) ->
1505
1539
  config = VerilogConfig() # Use default settings
1506
1540
  start_time = time.time()
1507
1541
  logging.info(f"Loading verilog: {', '.join(files)}")
1508
- __get_top_db().loadVerilog(files, keep_assigns=config.keep_assigns)
1542
+ __get_top_db().loadVerilog(
1543
+ files,
1544
+ keep_assigns=config.keep_assigns,
1545
+ allow_unknown_designs=config.allow_unknown_designs
1546
+ )
1509
1547
  execution_time = time.time() - start_time
1510
1548
  logging.info(f"Loading done in {execution_time:.2f} seconds")
1511
1549
  return get_top()
@@ -1515,6 +1553,8 @@ def load_liberty(files: Union[str, List[str]]):
1515
1553
  """Load liberty files.
1516
1554
 
1517
1555
  :param files: a list of liberty files to load or a single file.
1556
+ :rtype: None
1557
+ :raises Exception: if no liberty files are provided.
1518
1558
  """
1519
1559
  if isinstance(files, str):
1520
1560
  files = [files]
@@ -1531,6 +1571,9 @@ def load_primitives(name: str):
1531
1571
 
1532
1572
  - xilinx
1533
1573
  - yosys
1574
+ :param str name: the name of the primitives library to load.
1575
+ :raises ValueError: if the name is not recognized.
1576
+ :rtype: None
1534
1577
  """
1535
1578
  if name == "xilinx":
1536
1579
  from najaeda.primitives import xilinx
@@ -1590,14 +1633,18 @@ def get_model_name(id: tuple[int, int, int]) -> str:
1590
1633
 
1591
1634
 
1592
1635
  def apply_dle():
1593
- """Apply the DLE (Dead Logic Elimination) to the top design."""
1636
+ """Apply the DLE (Dead Logic Elimination) to the top design.
1637
+ :rtype: None
1638
+ """
1594
1639
  top = naja.NLUniverse.get().getTopDesign()
1595
1640
  if top is not None:
1596
1641
  naja.NLUniverse.get().applyDLE()
1597
1642
 
1598
1643
 
1599
1644
  def apply_constant_propagation():
1600
- """Apply constant propagation to the top design."""
1645
+ """Apply constant propagation to the top design.
1646
+ :rtype: None
1647
+ """
1601
1648
  top = naja.NLUniverse.get().getTopDesign()
1602
1649
  if top is not None:
1603
1650
  naja.NLUniverse.get().applyConstantPropagation()
najaeda/stats.py CHANGED
@@ -207,19 +207,19 @@ def compute_instance_stats(instance, instances_stats):
207
207
 
208
208
  def compute_instance_terms(instance, instance_stats):
209
209
  for term in instance.get_terms():
210
- if term.get_direction() == netlist.Term.INPUT:
210
+ if term.get_direction() == netlist.Term.Direction.INPUT:
211
211
  instance_stats.terms["inputs"] = instance_stats.terms.get("inputs", 0) + 1
212
212
  bit_terms = sum(1 for _ in term.get_bits())
213
213
  instance_stats.bit_terms["inputs"] = (
214
214
  instance_stats.bit_terms.get("inputs", 0) + bit_terms
215
215
  )
216
- elif term.get_direction() == netlist.Term.OUTPUT:
216
+ elif term.get_direction() == netlist.Term.Direction.OUTPUT:
217
217
  instance_stats.terms["outputs"] = instance_stats.terms.get("outputs", 0) + 1
218
218
  bit_terms = sum(1 for _ in term.get_bits())
219
219
  instance_stats.bit_terms["outputs"] = (
220
220
  instance_stats.bit_terms.get("outputs", 0) + bit_terms
221
221
  )
222
- elif term.get_direction() == netlist.Term.INOUT:
222
+ elif term.get_direction() == netlist.Term.Direction.INOUT:
223
223
  instance_stats.terms["inouts"] = instance_stats.terms.get("inouts", 0) + 1
224
224
  bit_terms = sum(1 for _ in term.get_bits())
225
225
  instance_stats.bit_terms["inouts"] = (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: najaeda
3
- Version: 0.1.24
3
+ Version: 0.2.0
4
4
  Summary: Naja EDA Python package
5
5
  Author-Email: Naja Authors <contact@keplertech.io>
6
6
  License: Apache License 2.0
@@ -19,16 +19,16 @@ Project-URL: Homepage, https://github.com/najaeda/naja
19
19
  Requires-Python: >=3.8
20
20
  Description-Content-Type: text/x-rst
21
21
 
22
- Naja EDA Python Package
22
+ najaeda Python Package
23
23
  =======================
24
24
 
25
- Naja EDA is a Python package that provides data structures and APIs for developing post-synthesis Electronic Design Automation (EDA) algorithms.
25
+ najaeda is a Python package that provides data structures and APIs for developing post-synthesis Electronic Design Automation (EDA) algorithms.
26
26
 
27
- Naja EDA provides a powerful yet simple framework designed to help software
27
+ najaeda provides a powerful yet simple framework designed to help software
28
28
  and hardware developers efficiently navigate and manipulate electronic
29
29
  design automation (EDA) workflows.
30
30
 
31
- With Naja EDA, you can:
31
+ With najaeda, you can:
32
32
 
33
33
  * Explore Netlists with Ease:
34
34
 
@@ -51,10 +51,10 @@ With Naja EDA, you can:
51
51
 
52
52
  * Build fast, tailored tools for solving specific challenges without relying on costly, proprietary EDA software.
53
53
 
54
- Naja EDA empowers developers to innovate, adapt, and accelerate their EDA
54
+ najaeda empowers developers to innovate, adapt, and accelerate their EDA
55
55
  processes with minimal overhead.
56
56
 
57
- Naja EDA is the Python counterpart of the `Naja C++ project <https://github.com/najaeda/naja>`_.
57
+ najaeda is the Python counterpart of the `Naja C++ project <https://github.com/najaeda/naja>`_.
58
58
 
59
59
  If you’re interested in this project, please consider starring it on GitHub.
60
60
  Feel free to reach out to us anytime at `contact@keplertech.io <mailto:contact@keplertech.io>`_.
@@ -68,6 +68,15 @@ Install Naja EDA using pip:
68
68
 
69
69
  pip install najaeda
70
70
 
71
+ Quick Start
72
+ -----------
73
+
74
+ To quickly explore what **najaeda** can do, launch the interactive tutorial notebook on Google Colab:
75
+
76
+ .. image:: https://colab.research.google.com/assets/colab-badge.svg
77
+ :target: https://colab.research.google.com/github/najaeda/najaeda-tutorials/blob/main/notebooks/01_getting_started.ipynb
78
+ :alt: Open in Colab
79
+
71
80
  Documentation
72
81
  -------------
73
82
 
@@ -1,17 +1,17 @@
1
- najaeda-0.1.24.dist-info/WHEEL,sha256=qWe43I_ziyqlu2SouxbZAN4VQzvapKrxWUcRsva4KM8,158
2
- najaeda-0.1.24.dist-info/METADATA,sha256=lDGwE7Obzgqwy7l70oK7xEsyYsisAYE1pQJwvbcUV_A,3046
3
- najaeda-0.1.24.dist-info/RECORD,,
4
- najaeda-0.1.24.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
5
- najaeda-0.1.24.dist-info/licenses/AUTHORS,sha256=7NYEGDAX_1QZvCCHfq8YVXC5ZbwH_pbNI8DcSmm70GU,377
6
- najaeda/libnaja_python.so,sha256=W5b4kuolBGgBGsdrapX1k0mDgCN4FcIOTCe--cXyMJg,1885729
7
- najaeda/libnaja_nl.so,sha256=jo5MHqPetOFnO5VElmM1bXtna9lk1RCuiU_ScPF97ak,1646832
8
- najaeda/naja.so,sha256=jt9wzlm-8EnhndE2JYkOpZCZKFwM8n73aDKl5GSWS50,206521
1
+ najaeda-0.2.0.dist-info/WHEEL,sha256=qWe43I_ziyqlu2SouxbZAN4VQzvapKrxWUcRsva4KM8,158
2
+ najaeda-0.2.0.dist-info/METADATA,sha256=641yOlolPMHaHlGtIdpSZj-Z_UMRIPQIQaMGqdoFlns,3383
3
+ najaeda-0.2.0.dist-info/RECORD,,
4
+ najaeda-0.2.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
5
+ najaeda-0.2.0.dist-info/licenses/AUTHORS,sha256=7NYEGDAX_1QZvCCHfq8YVXC5ZbwH_pbNI8DcSmm70GU,377
6
+ najaeda/libnaja_python.so,sha256=ONio-iM7c0wZWYQguNMeRRtsHNL1d6Jfh8eKp4VTd8E,1886289
7
+ najaeda/libnaja_nl.so,sha256=1hb7dG4c3T9nu-tne4xKQBP7aBysGi8XBULYgGO4WLc,1646856
8
+ najaeda/naja.so,sha256=WULLz9EYYjyorxBQw7jjvvMzNiHdeFGa2YZJ5r8ACYI,206521
9
9
  najaeda/pandas_stats.py,sha256=yOb4ka965U7rN4D6AwvSGmRyeT_O7Ed-5cmT8BFbfeo,1070
10
- najaeda/stats.py,sha256=wackXsf0x24ic9v-UifECHj4t5yveUWssMDZp2B057A,16187
11
- najaeda/libnaja_bne.so,sha256=41X1JqKAY6ydVaLZ6NI1qSJgC1MBcIkrCLq0z5nCjNU,272577
10
+ najaeda/stats.py,sha256=SJ9rca0Z6ldNAFOjU7DPO2hfx1zq-9Bec0Rx_oLasJo,16217
11
+ najaeda/libnaja_bne.so,sha256=ejZf2Zl2AXQagN41HIj8x-3oeoyEffcPTPR0YeY40ng,272577
12
12
  najaeda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- najaeda/libnaja_opt.so,sha256=l7VnRKnJRRy7IVVNTNjXILZrpgYFes6IlCJ0wK1dOAA,348881
14
- najaeda/netlist.py,sha256=ZFL00PMhc2pl_uu9_c3_lj65gSjD93zYvfbEFBLZhjg,54309
13
+ najaeda/libnaja_opt.so,sha256=OaKUGukDZekGp-yF__ZWbBpF1cnvvtEFzbaRMegzp8M,348713
14
+ najaeda/netlist.py,sha256=by21s-ZgGPYunPDHDmnuAA8E_Z9ZRD5tbyck5NrwoxI,55865
15
15
  najaeda/net_visitor.py,sha256=P_esjibYb-wBDuF-AyF7es9sJYw1Ha8RhTPu-qKe7G4,1940
16
16
  najaeda/libnaja_dnl.so,sha256=zkSbBWj0qCH6wE2gueif9tKoj6xrN7p9Gk01pHUkGBE,276041
17
17
  najaeda/instance_visitor.py,sha256=JMsPSQaWNiDjxS05rxg83a0PIsrOIuTi9G35hkwdibs,1530
@@ -26,7 +26,7 @@ najaeda/docs/source/netlist_classes.rst,sha256=Zrha9MQVEdEwxmP2zhgC0K3iioZXXerze
26
26
  najaeda/docs/source/examples.rst.in,sha256=4ZStOA3N5VHbKZgdn2kaEQZL7wPoJwODS2E1BO54uFY,2091
27
27
  najaeda/docs/source/equipotential.rst,sha256=0MDi-4fPEsX7K_ezWj5DB3mCalnhqN-sicYbQKYQfNc,335
28
28
  najaeda/docs/source/preprocessor.py,sha256=TK4LsTdNbv2dxkKQaJ7cEyo9PU5v_56vlrFCJYIPKf8,2625
29
- najaeda/docs/source/introduction.rst,sha256=kE4qxEJCgcAswiT3rIJS21oBYIMg1cyT_rKmOzQgvsI,2095
29
+ najaeda/docs/source/introduction.rst,sha256=nvxL5OQ-SeVWuTF6CY93iPt7S5ReXvqk5D9bW36CUUs,2416
30
30
  najaeda/docs/source/common_classes.rst,sha256=o20u3mcpFYINwy0sVdye90ZPMQcPqoH3V4ERKcG7SZI,181
31
31
  najaeda/docs/source/net.rst,sha256=i6YEir8ZOldSY8-UmPxgVJ4Ot3y-Q6seRkBr2H-KmXc,732
32
32
  najaeda/docs/source/index.rst,sha256=80VMfeEGHObnOUXRBxIzISQsG_HNkgT-pUpsDZsCfOY,387