Latest commit

History

956 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BFG

BFG is an open-source full-custom silicon compiler for high-performance FPGA fabrics. BFG makes FPGA IP. It works by hierarchically composing parameterised layout and circuit generators.

DOI

Silicon compilers are not novel, but using them for generating FPGAs outside of large companies apparently is.

Generators

As an example of what BFG can produce, here is a Configurable Logic Block based around a 4-LUT for Skywater 130nm. It's produced by the LutB generator:

CLB

(LutA was full of bad ideas learning.)

It can register either the LUT output or its bypass input. A combinational output pin also lets you select between the LUT output and the bypass, as in:

'

The CLB itself is made up of generators for flip-flops, a hierarchical transmission-gate mux, two differentbuffer topologies and active 2:1 muxes. Some of these are taken from the open-source sky130_fd_sc_hd library and then parameterised, others were made from scratch.

BFG can then assemble an S-44 LUT based around this CLB and a carry chain. Together with N:1 and N:2 (shared) multiplexer generators for interconnect wiring, and wire buses with configurable break-outs, this is enough to assemble a whole FPGA tile:

ReducedTile

Performance

The current paradigm for open-source FPGA generation centres on synthesising fabrics from standard cells. Here is the latest comparison of (post parasitic extraction) performance against standard-cell synthesis of the above CLB (all targeting Skywater 130nm):

latest results

A 59% reduction in power-delay-area product is, we claim, worth the effort to encode circuit and layout knowledge as code.

Process Portability

Certain classes of process share types of layout rules, which means designs are trivially portable by just changing the values for each of the various rules: minimum spacing, area, width, and so on. As an example of this, the Gf180McuMux uses Sky130Mux code to generate a GF 180 MCU-valid mux, when handed a rulebook with GF 180 MCU values instead. Other clases of process require different layout strategies altogether, and new generators to be written.

Status

BFG works, but has sharp edges. Because it is gradware and I am but one man. Also, even now that we have magical AI, it is bad a lot of the hard parts. Designs are DRC-clean enough to pass LVS, so we can measure their performance and compare it to the popular method of synthesising FPGAs from standard cells.

We think this is how open-source FPGAs should be built, even if it is hard. So we implore you to use, criticise, and contribute to this software!

Usage

BFG relies on VLSIR for producing common formats like LEF/DEF, GDS and (the various) Spices.

Once BFG and the prerequisites are installed:

$ cd build
$ ./bfg
--jobs 0 \
--technology ../sky130.technology.pb \
--primitives ../sky130.primitives.pb \
--external_circuits ../sky130hd.pb \
--logtostderr \
--write_text_format \
--run_generator LutB \
--params LutB.params.pb.txt \
--output_library LutB

This will produce LutB.library.pb, a binary-format protocol buffer describing the layout, and LutB.package.pb, a binary-format protocol buffer describing the circuit netlist.

The generator parameter file (LutB.params.pb.txt) is a text-format protocol buffer specifying the options for a particular generator according to the definitions in the parameter proto file.

To get a GDS, you need proto2gds from Layout21:

$ /path/to/Layout21/target/debug/proto2gds --verbose -i /path/to/LutB.library.pb -t /home/arya/src/bfg/sky130.technology.pb -o LutB.gds

To get spice, run simulation/netlist.py:

$ cd simulation
$ ./netlist.py /path/to/LutB.package.pb LutB.sp

Installation

See INSTALL.md.

Citation

@phdthesis{Reais-Parsi:EECS-2026-283,
Author= {Reais-Parsi, Arya},
Title= {BFG: An Open-Source Silicon Compiler for High-Performance Reconfigurable Fabrics},
School= {EECS Department, University of California, Berkeley},
Year= {2026},
Month= {Aug},
Url= {http://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-283.html},
Number= {UCB/EECS-2026-283},
Note= {Revised 21 August 2026.},
Abstract= {Synthesisable eFPGA generators have enabled considerable innovation and access to FPGA architecture research in recent years. By generating RTL descriptions of FPGA fabrics, these tools leverage established digital design flows to meaningfully reduce the time taken to tape-out a validated FPGA fabric. Unfortunately, the convenience of employing standard-cells over custom layout comes at the cost of reduced circuit performance. Research architectures lag their commercial counterparts in terms of performance, power and area. At the same time, the end of Moore’s Law and Dennard Scaling is contributing to unprecedented demand for domain-specific accelerators. Performant, easy-to-use and cheaper reconfigurable architectures are needed from the research community to meet this demand. This work presents BFG, an alternative approach to FPGA generation that programmatically generates all circuits together with custom layout. In SkyWater 130 nm, BFG’s cells achieve up to 59% lower power-delay-area product than equivalent logic synthesized with standard cells. In this work we present each of BFG’s four contributions: an unencumbered open-source C++ AMS design framework; a collection of parametric IP generators for FPGA components; a study reverse-engineering a modern commercial architecture; and, a modern columnar fabric architecture together with an example of how BFG might be used to build it. Though our study reveals significant complexity to this approach, we conclude that the performance benefits are justified by the shared development model. BFG provides researchers, enthusiasts and entrepreneurs a repository of fast circuitry and corresponding layout for the development of better FPGA IP.},
}

About

An Open-Source Full-Custom Silicon Compiler for High-Performance FPGA Fabrics

Resources

Stars

18 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

956 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BFG

BFG is an open-source full-custom silicon compiler for high-performance FPGA fabrics. BFG makes FPGA IP. It works by hierarchically composing parameterised layout and circuit generators.

DOI

Silicon compilers are not novel, but using them for generating FPGAs outside of large companies apparently is.

Generators

As an example of what BFG can produce, here is a Configurable Logic Block based around a 4-LUT for Skywater 130nm. It's produced by the LutB generator:

CLB

(LutA was full of bad ideas learning.)

It can register either the LUT output or its bypass input. A combinational output pin also lets you select between the LUT output and the bypass, as in:

'

The CLB itself is made up of generators for flip-flops, a hierarchical transmission-gate mux, two differentbuffer topologies and active 2:1 muxes. Some of these are taken from the open-source sky130_fd_sc_hd library and then parameterised, others were made from scratch.

BFG can then assemble an S-44 LUT based around this CLB and a carry chain. Together with N:1 and N:2 (shared) multiplexer generators for interconnect wiring, and wire buses with configurable break-outs, this is enough to assemble a whole FPGA tile:

ReducedTile

Performance

The current paradigm for open-source FPGA generation centres on synthesising fabrics from standard cells. Here is the latest comparison of (post parasitic extraction) performance against standard-cell synthesis of the above CLB (all targeting Skywater 130nm):

latest results

A 59% reduction in power-delay-area product is, we claim, worth the effort to encode circuit and layout knowledge as code.

Process Portability

Certain classes of process share types of layout rules, which means designs are trivially portable by just changing the values for each of the various rules: minimum spacing, area, width, and so on. As an example of this, the Gf180McuMux uses Sky130Mux code to generate a GF 180 MCU-valid mux, when handed a rulebook with GF 180 MCU values instead. Other clases of process require different layout strategies altogether, and new generators to be written.

Status

BFG works, but has sharp edges. Because it is gradware and I am but one man. Also, even now that we have magical AI, it is bad a lot of the hard parts. Designs are DRC-clean enough to pass LVS, so we can measure their performance and compare it to the popular method of synthesising FPGAs from standard cells.

We think this is how open-source FPGAs should be built, even if it is hard. So we implore you to use, criticise, and contribute to this software!

Usage

BFG relies on VLSIR for producing common formats like LEF/DEF, GDS and (the various) Spices.

Once BFG and the prerequisites are installed:

$ cd build
$ ./bfg
--jobs 0 \
--technology ../sky130.technology.pb \
--primitives ../sky130.primitives.pb \
--external_circuits ../sky130hd.pb \
--logtostderr \
--write_text_format \
--run_generator LutB \
--params LutB.params.pb.txt \
--output_library LutB

This will produce LutB.library.pb, a binary-format protocol buffer describing the layout, and LutB.package.pb, a binary-format protocol buffer describing the circuit netlist.

The generator parameter file (LutB.params.pb.txt) is a text-format protocol buffer specifying the options for a particular generator according to the definitions in the parameter proto file.

To get a GDS, you need proto2gds from Layout21:

$ /path/to/Layout21/target/debug/proto2gds --verbose -i /path/to/LutB.library.pb -t /home/arya/src/bfg/sky130.technology.pb -o LutB.gds

To get spice, run simulation/netlist.py:

$ cd simulation
$ ./netlist.py /path/to/LutB.package.pb LutB.sp

Installation

See INSTALL.md.

Citation

@phdthesis{Reais-Parsi:EECS-2026-283,
Author= {Reais-Parsi, Arya},
Title= {BFG: An Open-Source Silicon Compiler for High-Performance Reconfigurable Fabrics},
School= {EECS Department, University of California, Berkeley},
Year= {2026},
Month= {Aug},
Url= {http://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-283.html},
Number= {UCB/EECS-2026-283},
Note= {Revised 21 August 2026.},
Abstract= {Synthesisable eFPGA generators have enabled considerable innovation and access to FPGA architecture research in recent years. By generating RTL descriptions of FPGA fabrics, these tools leverage established digital design flows to meaningfully reduce the time taken to tape-out a validated FPGA fabric. Unfortunately, the convenience of employing standard-cells over custom layout comes at the cost of reduced circuit performance. Research architectures lag their commercial counterparts in terms of performance, power and area. At the same time, the end of Moore’s Law and Dennard Scaling is contributing to unprecedented demand for domain-specific accelerators. Performant, easy-to-use and cheaper reconfigurable architectures are needed from the research community to meet this demand. This work presents BFG, an alternative approach to FPGA generation that programmatically generates all circuits together with custom layout. In SkyWater 130 nm, BFG’s cells achieve up to 59% lower power-delay-area product than equivalent logic synthesized with standard cells. In this work we present each of BFG’s four contributions: an unencumbered open-source C++ AMS design framework; a collection of parametric IP generators for FPGA components; a study reverse-engineering a modern commercial architecture; and, a modern columnar fabric architecture together with an example of how BFG might be used to build it. Though our study reveals significant complexity to this approach, we conclude that the performance benefits are justified by the shared development model. BFG provides researchers, enthusiasts and entrepreneurs a repository of fast circuitry and corresponding layout for the development of better FPGA IP.},
}

About

An Open-Source Full-Custom Silicon Compiler for High-Performance FPGA Fabrics

Resources

Stars

18 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

956 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BFG

BFG is an open-source full-custom silicon compiler for high-performance FPGA fabrics. BFG makes FPGA IP. It works by hierarchically composing parameterised layout and circuit generators.

DOI

Silicon compilers are not novel, but using them for generating FPGAs outside of large companies apparently is.

Generators

As an example of what BFG can produce, here is a Configurable Logic Block based around a 4-LUT for Skywater 130nm. It's produced by the LutB generator:

CLB

(LutA was full of bad ideas learning.)

It can register either the LUT output or its bypass input. A combinational output pin also lets you select between the LUT output and the bypass, as in:

'

The CLB itself is made up of generators for flip-flops, a hierarchical transmission-gate mux, two differentbuffer topologies and active 2:1 muxes. Some of these are taken from the open-source sky130_fd_sc_hd library and then parameterised, others were made from scratch.

BFG can then assemble an S-44 LUT based around this CLB and a carry chain. Together with N:1 and N:2 (shared) multiplexer generators for interconnect wiring, and wire buses with configurable break-outs, this is enough to assemble a whole FPGA tile:

ReducedTile

Performance

The current paradigm for open-source FPGA generation centres on synthesising fabrics from standard cells. Here is the latest comparison of (post parasitic extraction) performance against standard-cell synthesis of the above CLB (all targeting Skywater 130nm):

latest results

A 59% reduction in power-delay-area product is, we claim, worth the effort to encode circuit and layout knowledge as code.

Process Portability

Certain classes of process share types of layout rules, which means designs are trivially portable by just changing the values for each of the various rules: minimum spacing, area, width, and so on. As an example of this, the Gf180McuMux uses Sky130Mux code to generate a GF 180 MCU-valid mux, when handed a rulebook with GF 180 MCU values instead. Other clases of process require different layout strategies altogether, and new generators to be written.

Status

BFG works, but has sharp edges. Because it is gradware and I am but one man. Also, even now that we have magical AI, it is bad a lot of the hard parts. Designs are DRC-clean enough to pass LVS, so we can measure their performance and compare it to the popular method of synthesising FPGAs from standard cells.

We think this is how open-source FPGAs should be built, even if it is hard. So we implore you to use, criticise, and contribute to this software!

Usage

BFG relies on VLSIR for producing common formats like LEF/DEF, GDS and (the various) Spices.

Once BFG and the prerequisites are installed:

$ cd build
$ ./bfg
--jobs 0 \
--technology ../sky130.technology.pb \
--primitives ../sky130.primitives.pb \
--external_circuits ../sky130hd.pb \
--logtostderr \
--write_text_format \
--run_generator LutB \
--params LutB.params.pb.txt \
--output_library LutB

This will produce LutB.library.pb, a binary-format protocol buffer describing the layout, and LutB.package.pb, a binary-format protocol buffer describing the circuit netlist.

The generator parameter file (LutB.params.pb.txt) is a text-format protocol buffer specifying the options for a particular generator according to the definitions in the parameter proto file.

To get a GDS, you need proto2gds from Layout21:

$ /path/to/Layout21/target/debug/proto2gds --verbose -i /path/to/LutB.library.pb -t /home/arya/src/bfg/sky130.technology.pb -o LutB.gds

To get spice, run simulation/netlist.py:

$ cd simulation
$ ./netlist.py /path/to/LutB.package.pb LutB.sp

Installation

See INSTALL.md.

Citation

@phdthesis{Reais-Parsi:EECS-2026-283,
Author= {Reais-Parsi, Arya},
Title= {BFG: An Open-Source Silicon Compiler for High-Performance Reconfigurable Fabrics},
School= {EECS Department, University of California, Berkeley},
Year= {2026},
Month= {Aug},
Url= {http://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-283.html},
Number= {UCB/EECS-2026-283},
Note= {Revised 21 August 2026.},
Abstract= {Synthesisable eFPGA generators have enabled considerable innovation and access to FPGA architecture research in recent years. By generating RTL descriptions of FPGA fabrics, these tools leverage established digital design flows to meaningfully reduce the time taken to tape-out a validated FPGA fabric. Unfortunately, the convenience of employing standard-cells over custom layout comes at the cost of reduced circuit performance. Research architectures lag their commercial counterparts in terms of performance, power and area. At the same time, the end of Moore’s Law and Dennard Scaling is contributing to unprecedented demand for domain-specific accelerators. Performant, easy-to-use and cheaper reconfigurable architectures are needed from the research community to meet this demand. This work presents BFG, an alternative approach to FPGA generation that programmatically generates all circuits together with custom layout. In SkyWater 130 nm, BFG’s cells achieve up to 59% lower power-delay-area product than equivalent logic synthesized with standard cells. In this work we present each of BFG’s four contributions: an unencumbered open-source C++ AMS design framework; a collection of parametric IP generators for FPGA components; a study reverse-engineering a modern commercial architecture; and, a modern columnar fabric architecture together with an example of how BFG might be used to build it. Though our study reveals significant complexity to this approach, we conclude that the performance benefits are justified by the shared development model. BFG provides researchers, enthusiasts and entrepreneurs a repository of fast circuitry and corresponding layout for the development of better FPGA IP.},
}

About

An Open-Source Full-Custom Silicon Compiler for High-Performance FPGA Fabrics

Resources

Stars

18 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

956 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BFG

BFG is an open-source full-custom silicon compiler for high-performance FPGA fabrics. BFG makes FPGA IP. It works by hierarchically composing parameterised layout and circuit generators.

DOI

Silicon compilers are not novel, but using them for generating FPGAs outside of large companies apparently is.

Generators

As an example of what BFG can produce, here is a Configurable Logic Block based around a 4-LUT for Skywater 130nm. It's produced by the LutB generator:

CLB

(LutA was full of bad ideas learning.)

It can register either the LUT output or its bypass input. A combinational output pin also lets you select between the LUT output and the bypass, as in:

'

The CLB itself is made up of generators for flip-flops, a hierarchical transmission-gate mux, two differentbuffer topologies and active 2:1 muxes. Some of these are taken from the open-source sky130_fd_sc_hd library and then parameterised, others were made from scratch.

BFG can then assemble an S-44 LUT based around this CLB and a carry chain. Together with N:1 and N:2 (shared) multiplexer generators for interconnect wiring, and wire buses with configurable break-outs, this is enough to assemble a whole FPGA tile:

ReducedTile

Performance

The current paradigm for open-source FPGA generation centres on synthesising fabrics from standard cells. Here is the latest comparison of (post parasitic extraction) performance against standard-cell synthesis of the above CLB (all targeting Skywater 130nm):

latest results

A 59% reduction in power-delay-area product is, we claim, worth the effort to encode circuit and layout knowledge as code.

Process Portability

Certain classes of process share types of layout rules, which means designs are trivially portable by just changing the values for each of the various rules: minimum spacing, area, width, and so on. As an example of this, the Gf180McuMux uses Sky130Mux code to generate a GF 180 MCU-valid mux, when handed a rulebook with GF 180 MCU values instead. Other clases of process require different layout strategies altogether, and new generators to be written.

Status

BFG works, but has sharp edges. Because it is gradware and I am but one man. Also, even now that we have magical AI, it is bad a lot of the hard parts. Designs are DRC-clean enough to pass LVS, so we can measure their performance and compare it to the popular method of synthesising FPGAs from standard cells.

We think this is how open-source FPGAs should be built, even if it is hard. So we implore you to use, criticise, and contribute to this software!

Usage

BFG relies on VLSIR for producing common formats like LEF/DEF, GDS and (the various) Spices.

Once BFG and the prerequisites are installed:

$ cd build
$ ./bfg
--jobs 0 \
--technology ../sky130.technology.pb \
--primitives ../sky130.primitives.pb \
--external_circuits ../sky130hd.pb \
--logtostderr \
--write_text_format \
--run_generator LutB \
--params LutB.params.pb.txt \
--output_library LutB

This will produce LutB.library.pb, a binary-format protocol buffer describing the layout, and LutB.package.pb, a binary-format protocol buffer describing the circuit netlist.

The generator parameter file (LutB.params.pb.txt) is a text-format protocol buffer specifying the options for a particular generator according to the definitions in the parameter proto file.

To get a GDS, you need proto2gds from Layout21:

$ /path/to/Layout21/target/debug/proto2gds --verbose -i /path/to/LutB.library.pb -t /home/arya/src/bfg/sky130.technology.pb -o LutB.gds

To get spice, run simulation/netlist.py:

$ cd simulation
$ ./netlist.py /path/to/LutB.package.pb LutB.sp

Installation

See INSTALL.md.

Citation

@phdthesis{Reais-Parsi:EECS-2026-283,
Author= {Reais-Parsi, Arya},
Title= {BFG: An Open-Source Silicon Compiler for High-Performance Reconfigurable Fabrics},
School= {EECS Department, University of California, Berkeley},
Year= {2026},
Month= {Aug},
Url= {http://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-283.html},
Number= {UCB/EECS-2026-283},
Note= {Revised 21 August 2026.},
Abstract= {Synthesisable eFPGA generators have enabled considerable innovation and access to FPGA architecture research in recent years. By generating RTL descriptions of FPGA fabrics, these tools leverage established digital design flows to meaningfully reduce the time taken to tape-out a validated FPGA fabric. Unfortunately, the convenience of employing standard-cells over custom layout comes at the cost of reduced circuit performance. Research architectures lag their commercial counterparts in terms of performance, power and area. At the same time, the end of Moore’s Law and Dennard Scaling is contributing to unprecedented demand for domain-specific accelerators. Performant, easy-to-use and cheaper reconfigurable architectures are needed from the research community to meet this demand. This work presents BFG, an alternative approach to FPGA generation that programmatically generates all circuits together with custom layout. In SkyWater 130 nm, BFG’s cells achieve up to 59% lower power-delay-area product than equivalent logic synthesized with standard cells. In this work we present each of BFG’s four contributions: an unencumbered open-source C++ AMS design framework; a collection of parametric IP generators for FPGA components; a study reverse-engineering a modern commercial architecture; and, a modern columnar fabric architecture together with an example of how BFG might be used to build it. Though our study reveals significant complexity to this approach, we conclude that the performance benefits are justified by the shared development model. BFG provides researchers, enthusiasts and entrepreneurs a repository of fast circuitry and corresponding layout for the development of better FPGA IP.},
}

About

An Open-Source Full-Custom Silicon Compiler for High-Performance FPGA Fabrics

Resources

Stars

18 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

956 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BFG

BFG is an open-source full-custom silicon compiler for high-performance FPGA fabrics. BFG makes FPGA IP. It works by hierarchically composing parameterised layout and circuit generators.

DOI

Silicon compilers are not novel, but using them for generating FPGAs outside of large companies apparently is.

Generators

As an example of what BFG can produce, here is a Configurable Logic Block based around a 4-LUT for Skywater 130nm. It's produced by the LutB generator:

CLB

(LutA was full of bad ideas learning.)

It can register either the LUT output or its bypass input. A combinational output pin also lets you select between the LUT output and the bypass, as in:

'

The CLB itself is made up of generators for flip-flops, a hierarchical transmission-gate mux, two differentbuffer topologies and active 2:1 muxes. Some of these are taken from the open-source sky130_fd_sc_hd library and then parameterised, others were made from scratch.

BFG can then assemble an S-44 LUT based around this CLB and a carry chain. Together with N:1 and N:2 (shared) multiplexer generators for interconnect wiring, and wire buses with configurable break-outs, this is enough to assemble a whole FPGA tile:

ReducedTile

Performance

The current paradigm for open-source FPGA generation centres on synthesising fabrics from standard cells. Here is the latest comparison of (post parasitic extraction) performance against standard-cell synthesis of the above CLB (all targeting Skywater 130nm):

latest results

A 59% reduction in power-delay-area product is, we claim, worth the effort to encode circuit and layout knowledge as code.

Process Portability

Certain classes of process share types of layout rules, which means designs are trivially portable by just changing the values for each of the various rules: minimum spacing, area, width, and so on. As an example of this, the Gf180McuMux uses Sky130Mux code to generate a GF 180 MCU-valid mux, when handed a rulebook with GF 180 MCU values instead. Other clases of process require different layout strategies altogether, and new generators to be written.

Status

BFG works, but has sharp edges. Because it is gradware and I am but one man. Also, even now that we have magical AI, it is bad a lot of the hard parts. Designs are DRC-clean enough to pass LVS, so we can measure their performance and compare it to the popular method of synthesising FPGAs from standard cells.

We think this is how open-source FPGAs should be built, even if it is hard. So we implore you to use, criticise, and contribute to this software!

Usage

BFG relies on VLSIR for producing common formats like LEF/DEF, GDS and (the various) Spices.

Once BFG and the prerequisites are installed:

$ cd build
$ ./bfg
--jobs 0 \
--technology ../sky130.technology.pb \
--primitives ../sky130.primitives.pb \
--external_circuits ../sky130hd.pb \
--logtostderr \
--write_text_format \
--run_generator LutB \
--params LutB.params.pb.txt \
--output_library LutB

This will produce LutB.library.pb, a binary-format protocol buffer describing the layout, and LutB.package.pb, a binary-format protocol buffer describing the circuit netlist.

The generator parameter file (LutB.params.pb.txt) is a text-format protocol buffer specifying the options for a particular generator according to the definitions in the parameter proto file.

To get a GDS, you need proto2gds from Layout21:

$ /path/to/Layout21/target/debug/proto2gds --verbose -i /path/to/LutB.library.pb -t /home/arya/src/bfg/sky130.technology.pb -o LutB.gds

To get spice, run simulation/netlist.py:

$ cd simulation
$ ./netlist.py /path/to/LutB.package.pb LutB.sp

Installation

See INSTALL.md.

Citation

@phdthesis{Reais-Parsi:EECS-2026-283,
Author= {Reais-Parsi, Arya},
Title= {BFG: An Open-Source Silicon Compiler for High-Performance Reconfigurable Fabrics},
School= {EECS Department, University of California, Berkeley},
Year= {2026},
Month= {Aug},
Url= {http://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-283.html},
Number= {UCB/EECS-2026-283},
Note= {Revised 21 August 2026.},
Abstract= {Synthesisable eFPGA generators have enabled considerable innovation and access to FPGA architecture research in recent years. By generating RTL descriptions of FPGA fabrics, these tools leverage established digital design flows to meaningfully reduce the time taken to tape-out a validated FPGA fabric. Unfortunately, the convenience of employing standard-cells over custom layout comes at the cost of reduced circuit performance. Research architectures lag their commercial counterparts in terms of performance, power and area. At the same time, the end of Moore’s Law and Dennard Scaling is contributing to unprecedented demand for domain-specific accelerators. Performant, easy-to-use and cheaper reconfigurable architectures are needed from the research community to meet this demand. This work presents BFG, an alternative approach to FPGA generation that programmatically generates all circuits together with custom layout. In SkyWater 130 nm, BFG’s cells achieve up to 59% lower power-delay-area product than equivalent logic synthesized with standard cells. In this work we present each of BFG’s four contributions: an unencumbered open-source C++ AMS design framework; a collection of parametric IP generators for FPGA components; a study reverse-engineering a modern commercial architecture; and, a modern columnar fabric architecture together with an example of how BFG might be used to build it. Though our study reveals significant complexity to this approach, we conclude that the performance benefits are justified by the shared development model. BFG provides researchers, enthusiasts and entrepreneurs a repository of fast circuitry and corresponding layout for the development of better FPGA IP.},
}

About

An Open-Source Full-Custom Silicon Compiler for High-Performance FPGA Fabrics

Resources

Stars

18 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

956 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BFG

BFG is an open-source full-custom silicon compiler for high-performance FPGA fabrics. BFG makes FPGA IP. It works by hierarchically composing parameterised layout and circuit generators.

DOI

Silicon compilers are not novel, but using them for generating FPGAs outside of large companies apparently is.

Generators

As an example of what BFG can produce, here is a Configurable Logic Block based around a 4-LUT for Skywater 130nm. It's produced by the LutB generator:

CLB

(LutA was full of bad ideas learning.)

It can register either the LUT output or its bypass input. A combinational output pin also lets you select between the LUT output and the bypass, as in:

'

The CLB itself is made up of generators for flip-flops, a hierarchical transmission-gate mux, two differentbuffer topologies and active 2:1 muxes. Some of these are taken from the open-source sky130_fd_sc_hd library and then parameterised, others were made from scratch.

BFG can then assemble an S-44 LUT based around this CLB and a carry chain. Together with N:1 and N:2 (shared) multiplexer generators for interconnect wiring, and wire buses with configurable break-outs, this is enough to assemble a whole FPGA tile:

ReducedTile

Performance

The current paradigm for open-source FPGA generation centres on synthesising fabrics from standard cells. Here is the latest comparison of (post parasitic extraction) performance against standard-cell synthesis of the above CLB (all targeting Skywater 130nm):

latest results

A 59% reduction in power-delay-area product is, we claim, worth the effort to encode circuit and layout knowledge as code.

Process Portability

Certain classes of process share types of layout rules, which means designs are trivially portable by just changing the values for each of the various rules: minimum spacing, area, width, and so on. As an example of this, the Gf180McuMux uses Sky130Mux code to generate a GF 180 MCU-valid mux, when handed a rulebook with GF 180 MCU values instead. Other clases of process require different layout strategies altogether, and new generators to be written.

Status

BFG works, but has sharp edges. Because it is gradware and I am but one man. Also, even now that we have magical AI, it is bad a lot of the hard parts. Designs are DRC-clean enough to pass LVS, so we can measure their performance and compare it to the popular method of synthesising FPGAs from standard cells.

We think this is how open-source FPGAs should be built, even if it is hard. So we implore you to use, criticise, and contribute to this software!

Usage

BFG relies on VLSIR for producing common formats like LEF/DEF, GDS and (the various) Spices.

Once BFG and the prerequisites are installed:

$ cd build
$ ./bfg
--jobs 0 \
--technology ../sky130.technology.pb \
--primitives ../sky130.primitives.pb \
--external_circuits ../sky130hd.pb \
--logtostderr \
--write_text_format \
--run_generator LutB \
--params LutB.params.pb.txt \
--output_library LutB

This will produce LutB.library.pb, a binary-format protocol buffer describing the layout, and LutB.package.pb, a binary-format protocol buffer describing the circuit netlist.

The generator parameter file (LutB.params.pb.txt) is a text-format protocol buffer specifying the options for a particular generator according to the definitions in the parameter proto file.

To get a GDS, you need proto2gds from Layout21:

$ /path/to/Layout21/target/debug/proto2gds --verbose -i /path/to/LutB.library.pb -t /home/arya/src/bfg/sky130.technology.pb -o LutB.gds

To get spice, run simulation/netlist.py:

$ cd simulation
$ ./netlist.py /path/to/LutB.package.pb LutB.sp

Installation

See INSTALL.md.

Citation

@phdthesis{Reais-Parsi:EECS-2026-283,
Author= {Reais-Parsi, Arya},
Title= {BFG: An Open-Source Silicon Compiler for High-Performance Reconfigurable Fabrics},
School= {EECS Department, University of California, Berkeley},
Year= {2026},
Month= {Aug},
Url= {http://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-283.html},
Number= {UCB/EECS-2026-283},
Note= {Revised 21 August 2026.},
Abstract= {Synthesisable eFPGA generators have enabled considerable innovation and access to FPGA architecture research in recent years. By generating RTL descriptions of FPGA fabrics, these tools leverage established digital design flows to meaningfully reduce the time taken to tape-out a validated FPGA fabric. Unfortunately, the convenience of employing standard-cells over custom layout comes at the cost of reduced circuit performance. Research architectures lag their commercial counterparts in terms of performance, power and area. At the same time, the end of Moore’s Law and Dennard Scaling is contributing to unprecedented demand for domain-specific accelerators. Performant, easy-to-use and cheaper reconfigurable architectures are needed from the research community to meet this demand. This work presents BFG, an alternative approach to FPGA generation that programmatically generates all circuits together with custom layout. In SkyWater 130 nm, BFG’s cells achieve up to 59% lower power-delay-area product than equivalent logic synthesized with standard cells. In this work we present each of BFG’s four contributions: an unencumbered open-source C++ AMS design framework; a collection of parametric IP generators for FPGA components; a study reverse-engineering a modern commercial architecture; and, a modern columnar fabric architecture together with an example of how BFG might be used to build it. Though our study reveals significant complexity to this approach, we conclude that the performance benefits are justified by the shared development model. BFG provides researchers, enthusiasts and entrepreneurs a repository of fast circuitry and corresponding layout for the development of better FPGA IP.},
}

About

An Open-Source Full-Custom Silicon Compiler for High-Performance FPGA Fabrics

Resources

Stars

18 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

956 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BFG

BFG is an open-source full-custom silicon compiler for high-performance FPGA fabrics. BFG makes FPGA IP. It works by hierarchically composing parameterised layout and circuit generators.

DOI

Silicon compilers are not novel, but using them for generating FPGAs outside of large companies apparently is.

Generators

As an example of what BFG can produce, here is a Configurable Logic Block based around a 4-LUT for Skywater 130nm. It's produced by the LutB generator:

CLB

(LutA was full of bad ideas learning.)

It can register either the LUT output or its bypass input. A combinational output pin also lets you select between the LUT output and the bypass, as in:

'

The CLB itself is made up of generators for flip-flops, a hierarchical transmission-gate mux, two differentbuffer topologies and active 2:1 muxes. Some of these are taken from the open-source sky130_fd_sc_hd library and then parameterised, others were made from scratch.

BFG can then assemble an S-44 LUT based around this CLB and a carry chain. Together with N:1 and N:2 (shared) multiplexer generators for interconnect wiring, and wire buses with configurable break-outs, this is enough to assemble a whole FPGA tile:

ReducedTile

Performance

The current paradigm for open-source FPGA generation centres on synthesising fabrics from standard cells. Here is the latest comparison of (post parasitic extraction) performance against standard-cell synthesis of the above CLB (all targeting Skywater 130nm):

latest results

A 59% reduction in power-delay-area product is, we claim, worth the effort to encode circuit and layout knowledge as code.

Process Portability

Certain classes of process share types of layout rules, which means designs are trivially portable by just changing the values for each of the various rules: minimum spacing, area, width, and so on. As an example of this, the Gf180McuMux uses Sky130Mux code to generate a GF 180 MCU-valid mux, when handed a rulebook with GF 180 MCU values instead. Other clases of process require different layout strategies altogether, and new generators to be written.

Status

BFG works, but has sharp edges. Because it is gradware and I am but one man. Also, even now that we have magical AI, it is bad a lot of the hard parts. Designs are DRC-clean enough to pass LVS, so we can measure their performance and compare it to the popular method of synthesising FPGAs from standard cells.

We think this is how open-source FPGAs should be built, even if it is hard. So we implore you to use, criticise, and contribute to this software!

Usage

BFG relies on VLSIR for producing common formats like LEF/DEF, GDS and (the various) Spices.

Once BFG and the prerequisites are installed:

$ cd build
$ ./bfg
--jobs 0 \
--technology ../sky130.technology.pb \
--primitives ../sky130.primitives.pb \
--external_circuits ../sky130hd.pb \
--logtostderr \
--write_text_format \
--run_generator LutB \
--params LutB.params.pb.txt \
--output_library LutB

This will produce LutB.library.pb, a binary-format protocol buffer describing the layout, and LutB.package.pb, a binary-format protocol buffer describing the circuit netlist.

The generator parameter file (LutB.params.pb.txt) is a text-format protocol buffer specifying the options for a particular generator according to the definitions in the parameter proto file.

To get a GDS, you need proto2gds from Layout21:

$ /path/to/Layout21/target/debug/proto2gds --verbose -i /path/to/LutB.library.pb -t /home/arya/src/bfg/sky130.technology.pb -o LutB.gds

To get spice, run simulation/netlist.py:

$ cd simulation
$ ./netlist.py /path/to/LutB.package.pb LutB.sp

Installation

See INSTALL.md.

Citation

@phdthesis{Reais-Parsi:EECS-2026-283,
Author= {Reais-Parsi, Arya},
Title= {BFG: An Open-Source Silicon Compiler for High-Performance Reconfigurable Fabrics},
School= {EECS Department, University of California, Berkeley},
Year= {2026},
Month= {Aug},
Url= {http://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-283.html},
Number= {UCB/EECS-2026-283},
Note= {Revised 21 August 2026.},
Abstract= {Synthesisable eFPGA generators have enabled considerable innovation and access to FPGA architecture research in recent years. By generating RTL descriptions of FPGA fabrics, these tools leverage established digital design flows to meaningfully reduce the time taken to tape-out a validated FPGA fabric. Unfortunately, the convenience of employing standard-cells over custom layout comes at the cost of reduced circuit performance. Research architectures lag their commercial counterparts in terms of performance, power and area. At the same time, the end of Moore’s Law and Dennard Scaling is contributing to unprecedented demand for domain-specific accelerators. Performant, easy-to-use and cheaper reconfigurable architectures are needed from the research community to meet this demand. This work presents BFG, an alternative approach to FPGA generation that programmatically generates all circuits together with custom layout. In SkyWater 130 nm, BFG’s cells achieve up to 59% lower power-delay-area product than equivalent logic synthesized with standard cells. In this work we present each of BFG’s four contributions: an unencumbered open-source C++ AMS design framework; a collection of parametric IP generators for FPGA components; a study reverse-engineering a modern commercial architecture; and, a modern columnar fabric architecture together with an example of how BFG might be used to build it. Though our study reveals significant complexity to this approach, we conclude that the performance benefits are justified by the shared development model. BFG provides researchers, enthusiasts and entrepreneurs a repository of fast circuitry and corresponding layout for the development of better FPGA IP.},
}

About

An Open-Source Full-Custom Silicon Compiler for High-Performance FPGA Fabrics

Resources

Stars

18 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

956 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

BFG

BFG is an open-source full-custom silicon compiler for high-performance FPGA fabrics. BFG makes FPGA IP. It works by hierarchically composing parameterised layout and circuit generators.

DOI

Silicon compilers are not novel, but using them for generating FPGAs outside of large companies apparently is.

Generators

As an example of what BFG can produce, here is a Configurable Logic Block based around a 4-LUT for Skywater 130nm. It's produced by the LutB generator:

CLB

(LutA was full of bad ideas learning.)

It can register either the LUT output or its bypass input. A combinational output pin also lets you select between the LUT output and the bypass, as in:

'

The CLB itself is made up of generators for flip-flops, a hierarchical transmission-gate mux, two differentbuffer topologies and active 2:1 muxes. Some of these are taken from the open-source sky130_fd_sc_hd library and then parameterised, others were made from scratch.

BFG can then assemble an S-44 LUT based around this CLB and a carry chain. Together with N:1 and N:2 (shared) multiplexer generators for interconnect wiring, and wire buses with configurable break-outs, this is enough to assemble a whole FPGA tile:

ReducedTile

Performance

The current paradigm for open-source FPGA generation centres on synthesising fabrics from standard cells. Here is the latest comparison of (post parasitic extraction) performance against standard-cell synthesis of the above CLB (all targeting Skywater 130nm):

latest results

A 59% reduction in power-delay-area product is, we claim, worth the effort to encode circuit and layout knowledge as code.

Process Portability

Certain classes of process share types of layout rules, which means designs are trivially portable by just changing the values for each of the various rules: minimum spacing, area, width, and so on. As an example of this, the Gf180McuMux uses Sky130Mux code to generate a GF 180 MCU-valid mux, when handed a rulebook with GF 180 MCU values instead. Other clases of process require different layout strategies altogether, and new generators to be written.

Status

BFG works, but has sharp edges. Because it is gradware and I am but one man. Also, even now that we have magical AI, it is bad a lot of the hard parts. Designs are DRC-clean enough to pass LVS, so we can measure their performance and compare it to the popular method of synthesising FPGAs from standard cells.

We think this is how open-source FPGAs should be built, even if it is hard. So we implore you to use, criticise, and contribute to this software!

Usage

BFG relies on VLSIR for producing common formats like LEF/DEF, GDS and (the various) Spices.

Once BFG and the prerequisites are installed:

$ cd build
$ ./bfg
--jobs 0 \
--technology ../sky130.technology.pb \
--primitives ../sky130.primitives.pb \
--external_circuits ../sky130hd.pb \
--logtostderr \
--write_text_format \
--run_generator LutB \
--params LutB.params.pb.txt \
--output_library LutB

This will produce LutB.library.pb, a binary-format protocol buffer describing the layout, and LutB.package.pb, a binary-format protocol buffer describing the circuit netlist.

The generator parameter file (LutB.params.pb.txt) is a text-format protocol buffer specifying the options for a particular generator according to the definitions in the parameter proto file.

To get a GDS, you need proto2gds from Layout21:

$ /path/to/Layout21/target/debug/proto2gds --verbose -i /path/to/LutB.library.pb -t /home/arya/src/bfg/sky130.technology.pb -o LutB.gds

To get spice, run simulation/netlist.py:

$ cd simulation
$ ./netlist.py /path/to/LutB.package.pb LutB.sp

Installation

See INSTALL.md.

Citation

@phdthesis{Reais-Parsi:EECS-2026-283,
Author= {Reais-Parsi, Arya},
Title= {BFG: An Open-Source Silicon Compiler for High-Performance Reconfigurable Fabrics},
School= {EECS Department, University of California, Berkeley},
Year= {2026},
Month= {Aug},
Url= {http://www2.eecs.berkeley.edu/Pubs/TechRpts/2026/EECS-2026-283.html},
Number= {UCB/EECS-2026-283},
Note= {Revised 21 August 2026.},
Abstract= {Synthesisable eFPGA generators have enabled considerable innovation and access to FPGA architecture research in recent years. By generating RTL descriptions of FPGA fabrics, these tools leverage established digital design flows to meaningfully reduce the time taken to tape-out a validated FPGA fabric. Unfortunately, the convenience of employing standard-cells over custom layout comes at the cost of reduced circuit performance. Research architectures lag their commercial counterparts in terms of performance, power and area. At the same time, the end of Moore’s Law and Dennard Scaling is contributing to unprecedented demand for domain-specific accelerators. Performant, easy-to-use and cheaper reconfigurable architectures are needed from the research community to meet this demand. This work presents BFG, an alternative approach to FPGA generation that programmatically generates all circuits together with custom layout. In SkyWater 130 nm, BFG’s cells achieve up to 59% lower power-delay-area product than equivalent logic synthesized with standard cells. In this work we present each of BFG’s four contributions: an unencumbered open-source C++ AMS design framework; a collection of parametric IP generators for FPGA components; a study reverse-engineering a modern commercial architecture; and, a modern columnar fabric architecture together with an example of how BFG might be used to build it. Though our study reveals significant complexity to this approach, we conclude that the performance benefits are justified by the shared development model. BFG provides researchers, enthusiasts and entrepreneurs a repository of fast circuitry and corresponding layout for the development of better FPGA IP.},
}

About

An Open-Source Full-Custom Silicon Compiler for High-Performance FPGA Fabrics

Resources

Stars

18 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages