Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Table of Contents
If you just need to use aiger
, you can just run:
$ pip install py-aiger
For developers, note that this project uses the poetry python package/dependency management tool. Please familarize yourself with it and then run:
$ poetry install
import aiger
x, y, z, w = aiger.atoms('x', 'y', 'z', 'w')
expr1 = z.implies(x & y)
expr2 = z & w
circ1 = expr1.with_output('z') \ # Get AIG for expr1 with output 'z'.
.aig
circ2 = circ1 >> circ2 # Feed outputs of circ1 into circ2.
While powerful, when writing combinatorial circuits, the Sequential Circuit DSL can be somewhat clumsy. For this common usecase, we have developed the Boolean Expression DSL. All circuits generated this way have a single output.
import aiger
x, y, z = aiger.atoms('x', 'y', 'z')
expr1 = x & y # circuit with inputs 'x', 'y' and 1 output computing x AND y.
expr2 = x | y # logical or.
expr3 = x ^ y # logical xor.
expr4 = x == y # logical ==, xnor.
expr5 = x.implies(y)
expr6 = ~x # logical negation.
expr7 = aiger.ite(x, y, z) # if x then y else z.
# Atoms can be constants.
expr8 = x & True # Equivalent to just x.
expr9 = x & False # Equivalent to const False.
# Specifying output name of boolean expression.
# - Output is a long uuid otherwise.
expr10 = expr5.with_output('x_implies_y')
assert expr10.output == 'x_implies_y'
# And you can inspect the AIG if needed.
circ = x.aig
# And of course, you can get a BoolExpr from a single output aig.
expr10 = aiger.BoolExpr(circ)
import aiger
from aiger import utils
# Parser for ascii AIGER format.
aig1 = aiger.load(path_to_aig1_file.aag)
aig2 = aiger.load(path_to_aig2_file.aag)
aig3 = aig1 >> aig2
aig4 = aig1 | aig2
Sometimes one requires some outputs to be feed back into the circuits
as time delayed inputs. This can be accomplished using the loopback
method. This method takes in a variable number of dictionaries
encoding how to wire an input to an output. The wiring dictionaries
with the following keys and default values:
Key | Default | Meaning |
---|---|---|
input | Input port | |
output | Output port | |
latch | input | Latch name |
init | True | Initial latch value |
keep_output | True | Keep loopbacked output as output |
# Connect output y to input x with delay, initialized to True.
# (Default initialization is False.)
aig5 = aig1.loopback({
"input": "x", "output": "y",
})
aig6 = aig1.loopback({
"input": "x", "output": "y",
}, {
"input": "z", "output": "z", "latch": "z_latch",
"init": False, "keep_outputs": False
})
There are two syntaxes for relabeling. The first uses indexing syntax in a nod to notation often used variable substition in math.
The syntax is the relabel method, which is preferable when one wants
to be explicit, even for those not familar with py-aiger
.
# Relabel input 'x' to 'z'.
aig1['i', {'x': 'z'}]
aig1.relabel('input', {'x': 'z'})
# Relabel output 'y' to 'w'.
aig1['o', {'y': 'w'}]
aig1.relabel('output', {'y': 'w'})
# Relabel latches 'l1' to 'l2'.
aig1['l', {'l1': 'l2'}]
aig1.relabel('latch', {'l1': 'l2'})
# Combinatoric evaluation.
aig3(inputs={'x':True, 'y':False})
# Sequential evaluation.
sim = aig3.simulate([{'x': 0, 'y': 0},
{'x': 1, 'y': 2},
{'x': 3, 'y': 4}])
# Simulation Coroutine
sim = aig3.simulator() # Coroutine
next(sim) # Initialize
print(sim.send({'x': 0, 'y': 0}))
print(sim.send({'x': 1, 'y': 2}))
print(sim.send({'x': 3, 'y': 4}))
# Unroll
aig4 = aig3.unroll(steps=10, init=True)
# Fix input x to be False.
aig4 = aiger.source({'x': False}) >> aig3
# Remove output y.
aig4 = aig3 >> aiger.sink(['y'])
# Create duplicate w of output y.
aig4 = aig3 >> aiger.tee({'y': ['y', 'w']})
aiger.common.eval_order(aig1) # Returns topological ordering of circuit gates.
# Convert object into an AIG from multiple formats including BoolExpr, AIG, str, and filepaths.
aiger.to_aig(aig1)
FAQs
A python library for manipulating sequential and-inverter gates.
We found that py-aiger demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.