Skip to content

Commit 766d800

Browse files
committed
Add partial low-level abc bindings
1 parent 02fbfbf commit 766d800

File tree

14 files changed

+13900
-0
lines changed

14 files changed

+13900
-0
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "abc-sys/abc"]
2+
path = abc-sys/abc
3+
url = https://github.com/YosysHQ/abc.git

Cargo.lock

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ members = [
99
"logger",
1010
"util",
1111
"ir",
12+
"abc-sys",
1213

1314
# comment to force multi-line layout
1415
]

abc-sys/Cargo.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "imctk-abc-sys"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
libc = "0.2.155"
8+
9+
[build-dependencies]
10+
cc = { version = "1.1.7", features = ["jobserver", "parallel"] }

abc-sys/abc

Submodule abc added at 28d955c

abc-sys/build.rs

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
use std::path::PathBuf;
2+
3+
static SRC_FILES: &[&str] = &[
4+
"abc/src/aig/gia/gia.h",
5+
"abc/src/aig/gia/giaCSatP.c",
6+
"abc/src/aig/gia/giaDup.c",
7+
"abc/src/aig/gia/giaEquiv.c",
8+
"abc/src/aig/gia/giaExist.c",
9+
"abc/src/aig/gia/giaFanout.c",
10+
"abc/src/aig/gia/giaHash.c",
11+
"abc/src/aig/gia/giaMan.c",
12+
"abc/src/aig/gia/giaScl.c",
13+
"abc/src/aig/gia/giaSim.c",
14+
"abc/src/aig/gia/giaUtil.c",
15+
"abc/src/base/main/mainFrame.c",
16+
"abc/src/base/main/mainReal.c",
17+
"abc/src/misc/mem/mem.c",
18+
"abc/src/misc/tim/timMan.c",
19+
"abc/src/misc/util/utilBridge.c",
20+
"abc/src/misc/util/utilCex.c",
21+
"abc/src/misc/util/utilFile.c",
22+
"abc/src/misc/util/utilSort.c",
23+
"abc/src/proof/cec/cecSatG2.c",
24+
"abc/src/proof/cec/cecSatG3.c",
25+
"abc/src/sat/glucose2/AbcGlucose2.cpp",
26+
"abc/src/sat/glucose2/AbcGlucoseCmd2.cpp",
27+
"abc/src/sat/glucose2/Glucose2.cpp",
28+
"abc/src/sat/glucose2/Options2.cpp",
29+
"abc/src/sat/glucose2/SimpSolver2.cpp",
30+
"abc/src/sat/glucose2/System2.cpp",
31+
"src/bindings.cpp",
32+
];
33+
34+
fn main() {
35+
if std::path::Path::new("codegen.sh").exists() {
36+
let status = std::process::Command::new("sh")
37+
.arg("codegen.sh")
38+
.spawn()
39+
.expect("couldn't run codegen script")
40+
.wait()
41+
.expect("couldn't run codegen script");
42+
assert!(status.code() == Some(0), "codegen script failed");
43+
}
44+
45+
if std::env::var("NO_SCCACHE").is_err()
46+
&& std::process::Command::new("sccache")
47+
.arg("--version")
48+
.status()
49+
.is_ok()
50+
{
51+
std::env::set_var(
52+
"CC",
53+
format!("sccache {}", std::env::var("CC").as_deref().unwrap_or("cc")),
54+
);
55+
std::env::set_var(
56+
"CXX",
57+
format!(
58+
"sccache {}",
59+
std::env::var("CXX").as_deref().unwrap_or("c++")
60+
),
61+
);
62+
}
63+
64+
let mut cc = cc::Build::new();
65+
66+
cc.warnings(false)
67+
.define("ABC_USE_STDINT_H", "1")
68+
.flag_if_supported("-Wno-unused-function")
69+
.flag_if_supported("-Wno-write-strings")
70+
.flag_if_supported("-Wno-sign-compare")
71+
.include("abc/src")
72+
.include(".");
73+
74+
let mut cc_c = cc.clone();
75+
let mut cc_cpp = cc;
76+
cc_cpp.cpp(true);
77+
78+
cc_cpp.files(SRC_FILES.iter().filter(|&f| f.ends_with(".cpp")));
79+
cc_c.files(SRC_FILES.iter().filter(|&f| f.ends_with(".c")));
80+
81+
for file in SRC_FILES {
82+
println!("cargo::rerun-if-changed={file}");
83+
}
84+
85+
let mut deps_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap());
86+
deps_dir.push("deps");
87+
88+
let cc_deps = [cc_cpp.clone(), cc_c.clone()];
89+
90+
cc_cpp.objects(cc_c.compile_intermediates());
91+
cc_cpp.compile("imctk-abc");
92+
93+
for mut cc_dep in cc_deps {
94+
cc_dep.out_dir(&deps_dir);
95+
let Ok(dep_files) = cc_dep.flag("-M").try_compile_intermediates() else {
96+
continue;
97+
};
98+
99+
for path in dep_files {
100+
let deps = std::fs::read_to_string(path).unwrap();
101+
102+
let Some((_c_file, headers)) = deps.split_once(':') else {
103+
continue;
104+
};
105+
106+
for header in headers
107+
.split_ascii_whitespace()
108+
.filter(|&part| !(part == "\\" || part.starts_with("/")))
109+
{
110+
println!("cargo::rerun-if-changed={header}");
111+
}
112+
}
113+
}
114+
}

abc-sys/codegen.sh

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#!/bin/sh
2+
set -eu
3+
crate_dir=$(dirname "$0")
4+
cd "$crate_dir"
5+
6+
echo "cargo::rerun-if-changed=codegen.sh"
7+
8+
if [ -f src/generated/bindings.d -a -f src/generated/bindings.sha256 ]; then
9+
for file in $(cat src/generated/bindings.d); do
10+
openssl dgst -sha256 $file
11+
done | cmp src/generated/bindings.sha256 && {
12+
for file in $(cat src/generated/bindings.d); do
13+
echo "cargo::rerun-if-changed=$file"
14+
done
15+
exit;
16+
}
17+
fi
18+
19+
20+
mkdir -p src/generated
21+
bindgen \
22+
--allowlist-file src/bindings.h \
23+
$(find abc/src -name "*.h" | awk '{print "--allowlist-file", $1}') \
24+
--blocklist-item vnsprintf \
25+
--no-doc-comments \
26+
--no-recursive-allowlist \
27+
--experimental \
28+
--wrap-static-fns \
29+
--wrap-static-fns-path src/generated/bindings.c \
30+
--wrap-static-fns-suffix _imctk_abc_sys \
31+
--depfile src/generated/bindings.d \
32+
src/bindings.h \
33+
-- -I abc/src -D ABC_USE_STDINT_H \
34+
> src/generated/bindings.rs
35+
36+
sed -Ee 's!(^.*?:| /[^ ]+)!!g' -i src/generated/bindings.d
37+
38+
echo >> src/generated/bindings.d
39+
echo "codegen.sh" >> src/generated/bindings.d
40+
41+
for file in $(cat src/generated/bindings.d); do
42+
openssl dgst -sha256 $file
43+
done > src/generated/bindings.sha256
44+
for file in $(cat src/generated/bindings.d); do
45+
echo "cargo::rerun-if-changed=$file"
46+
done

abc-sys/src/bindings.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "bindings.h"
2+
3+
extern "C" {
4+
5+
#include "generated/bindings.c"
6+
7+
}

abc-sys/src/bindings.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#ifndef IMCTK_ABC_SYS_BINDINGS_H
2+
#define IMCTK_ABC_SYS_BINDINGS_H
3+
4+
#include "aig/gia/gia.h"
5+
#include "misc/util/abc_global.h"
6+
#include "proof/cec/cec.h"
7+
8+
#ifdef __cplusplus
9+
extern "C" {
10+
#endif
11+
12+
void Cec4_ManSetParams(Cec_ParFra_t *pPars);
13+
Gia_Man_t *Cec5_ManSimulateTest(Gia_Man_t *p, Cec_ParFra_t *pPars,
14+
int fCbs, int approxLim, int subBatchSz,
15+
16+
int adaRecycle);
17+
18+
#ifdef __cplusplus
19+
}
20+
#endif
21+
22+
#endif

0 commit comments

Comments
 (0)