najaeda 0.1.24__cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl → 0.2.0__cp313-cp313-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.
- najaeda/docs/source/introduction.rst +10 -2
- najaeda/libnaja_bne.so +0 -0
- najaeda/libnaja_nl.so +0 -0
- najaeda/libnaja_opt.so +0 -0
- najaeda/libnaja_python.so +0 -0
- najaeda/naja.so +0 -0
- najaeda/netlist.py +89 -42
- najaeda/stats.py +3 -3
- {najaeda-0.1.24.dist-info → najaeda-0.2.0.dist-info}/METADATA +16 -7
- {najaeda-0.1.24.dist-info → najaeda-0.2.0.dist-info}/RECORD +13 -13
- {najaeda-0.1.24.dist-info → najaeda-0.2.0.dist-info}/WHEEL +0 -0
- {najaeda-0.1.24.dist-info → najaeda-0.2.0.dist-info}/licenses/AUTHORS +0 -0
- {najaeda-0.1.24.dist-info → najaeda-0.2.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -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
|
-
|
|
432
|
-
|
|
433
|
-
|
|
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 =
|
|
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.
|
|
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) ->
|
|
579
|
+
def get_direction(self) -> Direction:
|
|
575
580
|
"""
|
|
576
581
|
:return: the direction of the term.
|
|
577
|
-
:rtype:
|
|
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
|
-
|
|
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,
|
|
984
|
+
def get_child_instance(self, names: Union[str, list]):
|
|
979
985
|
"""
|
|
980
|
-
:param
|
|
981
|
-
|
|
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
|
-
|
|
985
|
-
|
|
986
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
-
:
|
|
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
|
-
|
|
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
|
-
|
|
1490
|
-
|
|
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(
|
|
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.
|
|
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
|
-
|
|
22
|
+
najaeda Python Package
|
|
23
23
|
=======================
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
najaeda is a Python package that provides data structures and APIs for developing post-synthesis Electronic Design Automation (EDA) algorithms.
|
|
26
26
|
|
|
27
|
-
|
|
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
|
|
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
|
-
|
|
54
|
+
najaeda empowers developers to innovate, adapt, and accelerate their EDA
|
|
55
55
|
processes with minimal overhead.
|
|
56
56
|
|
|
57
|
-
|
|
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.
|
|
2
|
-
najaeda-0.
|
|
3
|
-
najaeda-0.
|
|
4
|
-
najaeda-0.
|
|
5
|
-
najaeda-0.
|
|
6
|
-
najaeda/libnaja_python.so,sha256=
|
|
7
|
-
najaeda/libnaja_nl.so,sha256=
|
|
8
|
-
najaeda/naja.so,sha256=
|
|
1
|
+
najaeda-0.2.0.dist-info/WHEEL,sha256=A3mvWTV2IcEc7qLoVrqpNTZ0QD1zGDiFoYw9zZpB5kA,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=b3t3mDqpLr8Rc6camUXwVKq8J3YYWksxB0sFBTo_9p0,1886289
|
|
7
|
+
najaeda/libnaja_nl.so,sha256=1hb7dG4c3T9nu-tne4xKQBP7aBysGi8XBULYgGO4WLc,1646856
|
|
8
|
+
najaeda/naja.so,sha256=4swun4SgsWPkXSMfLwYdLL2dl_aND1P6TmB9ToCRSMI,206521
|
|
9
9
|
najaeda/pandas_stats.py,sha256=yOb4ka965U7rN4D6AwvSGmRyeT_O7Ed-5cmT8BFbfeo,1070
|
|
10
|
-
najaeda/stats.py,sha256=
|
|
11
|
-
najaeda/libnaja_bne.so,sha256=
|
|
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=
|
|
14
|
-
najaeda/netlist.py,sha256=
|
|
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=
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|