Giter VIP home page Giter VIP logo

amf-placer's Introduction

AMF-Placer 2.0

DocumentationFlow CMakeFlow LoCCode LoCComment

Introduction

AMF-Placer 2.0 is an open-source comprehensive timing-driven Analytical Mixed-size FPGA placer. It supports mixed-size placement of heterogeneous resources (e.g., LUT/FF/LUTRAM/MUX/CARRY/DSP/BRAM) on FPGA. To speed up the convergence and improve the timing quality of the placement, standing upon the shoulders of AMF-Placer 1.0, AMF-Placer 2.0 is equipped with a series of new techniques for timing optimization, including an effective regression-based timing model, placement-blockage-aware anchor insertion, WNS-aware timing-driven quadratic placement, and sector-guided detailed placement. Based on a set of the latest large open-source benchmarks from various domains for Xilinx Ultrascale FPGAs, experimental results indicate that critical path delays realized by AMF-Placer 2.0 are averagely 2.2% and 0.59% higher than those achieved by commercial tool Xilinx Vivavo 2020.2 and 2021.2 respectively. Meanwhile, the average runtime of placement procedure of AMF-Placer 2.0 is 6.7% and 11.4% lower than Xilinx Vivavo 2020.2 and 2021.2 respectively. Although limited by the absence of the exact timing model of the device, the information of design hierarchy and accurate routing feedback, AMF-Placer 2.0 is the first open-source FPGA placer which can handle the timing-driven mixed-size placement of practical complex designs with various FPGA resources and achieves the comparable quality to the latest commercial tools. Detailed Doxygen-based documentation (e.g, introduction, usage, implementation and experimental results) can be accessed here.

Convergence (OpenPiton) Convergence (MiniMap2) Convergence (OptimSoC) Convergence (MemN2N)GUIGUIdetailed

License

This project is developed by Reconfiguration Computing Systems Lab, Hong Kong University of Science and Technology (HKUST). Tingyuan Liang ([email protected]), Gengjie Chen ([email protected]), Jieru Zhao ([email protected]), Sharad Sinha ([email protected]) and Wei Zhang ([email protected]) are the major contributors of this project.

In this repo, we provide the basic implementation of AMF-Placer 2.0, under the Apache License 2.0, supporting comprehensive timing-driven placement with critical path delay and runtime which are downgraded slightly by ~5% on average. If you want to obtain the advanced version of AMF-Placer 2.0 to reproduce the experimental results in the paper of AMF-Placer 2.0 for academic evaluation or commercial usage, you are required to contact the authors Tingyuan Liang ([email protected]) and Wei ZHANG ([email protected]) with your offcial instituation email and we will response in 72 hours. If you are commercial entities, you can also contact [email protected] for licensing opportunities of the advanced version. The authors acknowledge support from the Hong Kong Research Grants Council (HK-RGC) General Research Funds (GRF No. 16213521) and thank the anonymous reviewers for their valuable comments to improve the quality of the papers.

Publications

If our works are involved in your works, please cite our papers:

[1] AMF-Placer: High-Performance Analytical Mixed-size Placer for FPGA(pre-print)

@INPROCEEDINGS{AMFPlacer,  
   title={AMF-Placer: High-Performance Analytical Mixed-size Placer for FPGA},
   author={Liang, Tingyuan and Chen, Gengjie and Zhao, Jieru and Sinha, Sharad and Zhang, Wei},  
   booktitle={2021 IEEE/ACM International Conference on Computer-Aided Design (ICCAD)},   
   year={2021},  volume={},  number={},  pages={1-6},
}

[2] AMF-Placer 2.0: Open Source Timing-driven Analytical Mixed-size Placer for Large-scale Heterogeneous FPGA(pre-print)

@ARTICLE{liang2024amf,
  author={Liang, Tingyuan and Chen, Gengjie and Zhao, Jieru and Sinha, Sharad and Zhang, Wei},
  journal={IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems}, 
  title={AMF-Placer 2.0: Open Source Timing-Driven Analytical Mixed-Size Placer for Large-Scale Heterogeneous FPGA}, 
  year={2024},
  volume={},
  number={},
  pages={1-1},
  keywords={Field programmable gate arrays;Timing;Computer architecture;Microprocessors;Table lookup;Routing;Standards;timing-driven placement;analytical placement;mixed-size placement;FPGA},
  doi={10.1109/TCAD.2024.3373357}}

Motivations

  1. Just reinvent the wheel for fun, try to build a complete flow and reproduce/improve some state-of-art techniques in the latest papers.
  2. Resolve some existing constraints in some previous works and consider more practical situations, like FPGA mixed-size placement with a series of optimization from the perspectives of timing, clocking, routability-aware and parallelism.
  3. A beginner-friendly placement framework with clear hierarchy and detailed Doxygen-based documentation. We hope that it can lower the overhead for people who are also interested in this research area.
  4. Currently, this framework is under development and it is still far from our goals and the practical demands, but we are happy to share our progress in this GitHub repository. If you have any questions/problems/suggestions, please contact feel free to contact us (Tingyuan LIANG, [email protected])

Features

  1. supports placeemnt with a large number of mixed-size macros with shape constraints in practical FPGA applications.
  2. wirelength-driven, routability-aware, packing-aware, clock-aware, region-aware.
  3. initially timing-driven with basic embedded static timing analysis, WNS-aware global placement, efficient detailed placement
  4. a set of optional optimization techniques to improve mixed-size FPGA placement QoR
  5. parallelizes the implementation of each stage of placement based on multi-threading
  6. modularized function implementation for easier further development
  7. flexible and extensible JSON-based placement configuration
  8. supports placement check-point importing/exporting
  9. a set of pre-implementation benchmarks from latest practical FPGA applications
  10. provides a set of Tcl scripts which extracts design netlist from Vivado and exports post-placement information to Vivado
  11. A basic GUI for user to analyze the placement procedure to optimize the implementation

Implementation Overview

Implementation Overview

Project Hiearchy

Below is a hiearchy tree of this project. As for the details, please refer to the class information and collaboration diagram in the Doxygen documentation and trace the implementation, e.g., AMFPlacer, GlobalPlacer, and PlacementInfo.

├── benchmarks  // benchmark information
│   ├── analysisScripts  // experimental result analysis Python scripts
│   ├── testConfig       // some test settings of placer
│   ├── VCU108           // information of design and device for VCU108
│   │   ├── compatibleTable    // mapping information between design and device
│   │   ├── design             // design information
│   │   └── device             // device information
│   └── vivadoScripts    // some Vivado Tcl scripts to extract design/device information
├── build                // potential target directory for built output
├── doc                  // documentation-related materials
└── src                  // source code of the project
    ├── app              // application (e.g., AMFPlacer)
    │   └── AMFPlacer    // A High-Performance Analytical Mixed-size Placer for FPGA
    └── lib              // libraries for application implementation
        ├── 3rdParty     // third-party libraries
        ├── HiFPlacer    // our placement function modules
        │   ├── designInfo
        │   ├── deviceInfo
        │   ├── placement
        │   │   ├── globalPlacement
        │   │   ├── legalization
        │   │   ├── packing
        │   │   ├── placementInfo
        │   │   └── placementTiming
        │   └── problemSolvers
        └── utils        // some minor utility functions

Dependencies

AMF-Placer 2.0 relies on the following dependencies and we sincerely appreciate the efforts of the authors of the related open-source project. Each of them has corresponding licensing policy and please confirm that you are following the rules mentioned in the licenses. In the source code of AMF-Placer 2.0, we only include the open-source projects under the Apache License 2.0 or MIT License. The other dependencies will be downloaded when you are building the project and interact with the main body of AMF-Placer 2.0 via libraries and APIs.

  1. eigen 3.3.8 (MPL2 license, source code will be downlaoded into the building directory during building if you have not installed it)
  2. PaToH (academic use only, library will be downlaoded into the building directory)
  3. Asmjit (Apache License, source code included in src/lib/3rdParty/asmjit for fast placement rendering)
  4. Blend2d (Apache License, source code included in src/lib/3rdParty/blend2d for fast placement rendering)
  5. Qt5 (for GUI, you can install it on Ubuntu by: sudo apt-get install qt5-default )
  6. KDTree (MIT License, source code included in src/lib/3rdParty/KDTree)
  7. Maximal Cardinality Matching (MIT License, source code included in src/lib/3rdParty/MaximalCardinalityMatching))
  8. Min Cost Flow (MIT License, source code included in src/lib/3rdParty/minCostFlow

Todo List

  1. clock tree synthesis
  2. ckock-related optimization
  3. reduce the hyperparameters in the algorithms and make them adaptive to design features

Issue Report

This project is under active development and far from perfect. We do want to make the placer useful for people in the community. Therefore,

  • If you have any question/problem, please feel free to create an issue in the GitHub Issue or email us (Tingyuan LIANG, [email protected])
  • We sincerely welcome code contribution to this project or suggestion in any approach!

(last updated Oct 26, 2022)

amf-placer's People

Contributors

magic3007 avatar zslwyuan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

amf-placer's Issues

Could not find "Q_WS_WIN", "Q_WS_QWS" and "Q_WS_MAC" during the cmake

Hello! I am following the AMFPlacer because we are doing the MLCAD2023 contest concerning the FPGA Macro placement. Because there is no requirement of timing, we use the AMF-Placer-ICCAD-2021 release. However, when I input "bash build.sh". An error indicates that there are some problems saying that it could not find "Q_WS_WIN", "Q_WS_QWS" and "Q_WS_MAC". The CMakeError.log is as follows:

Determining if the Q_WS_WIN exist failed with the following output:
Change Dir: /data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp

Run Build Command(s):/usr/bin/make cmTC_ea17a/fast && /usr/bin/make  -f CMakeFiles/cmTC_ea17a.dir/build.make CMakeFiles/cmTC_ea17a.dir/build
make[1]: Entering directory '/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp'
Building CXX object CMakeFiles/cmTC_ea17a.dir/CheckSymbolExists.cxx.o
/data/ssd/hcli/usr/local/bin/g++   -I/usr/include/qt4  -O3 -fopenmp -O1 -g1    -o CMakeFiles/cmTC_ea17a.dir/CheckSymbolExists.cxx.o -c /data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx
/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx: In function ‘int main(int, char**)’:
/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx:8:19: error: ‘Q_WS_WIN’ was not declared in this scope
    8 |   return ((int*)(&Q_WS_WIN))[argc];
      |                   ^~~~~~~~
CMakeFiles/cmTC_ea17a.dir/build.make:85: recipe for target 'CMakeFiles/cmTC_ea17a.dir/CheckSymbolExists.cxx.o' failed
make[1]: *** [CMakeFiles/cmTC_ea17a.dir/CheckSymbolExists.cxx.o] Error 1
make[1]: Leaving directory '/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp'
Makefile:141: recipe for target 'cmTC_ea17a/fast' failed
make: *** [cmTC_ea17a/fast] Error 2


File /data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx:
/* */
#include <QtCore/qglobal.h>

int main(int argc, char** argv)
{
  (void)argv;
#ifndef Q_WS_WIN
  return ((int*)(&Q_WS_WIN))[argc];
#else
  (void)argc;
  return 0;
#endif
}
Determining if the Q_WS_QWS exist failed with the following output:
Change Dir: /data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp

Run Build Command(s):/usr/bin/make cmTC_28b9d/fast && /usr/bin/make  -f CMakeFiles/cmTC_28b9d.dir/build.make CMakeFiles/cmTC_28b9d.dir/build
make[1]: Entering directory '/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp'
Building CXX object CMakeFiles/cmTC_28b9d.dir/CheckSymbolExists.cxx.o
/data/ssd/hcli/usr/local/bin/g++   -I/usr/include/qt4  -O3 -fopenmp -O1 -g1    -o CMakeFiles/cmTC_28b9d.dir/CheckSymbolExists.cxx.o -c /data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx
/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx: In function ‘int main(int, char**)’:
/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx:8:19: error: ‘Q_WS_QWS’ was not declared in this scope
    8 |   return ((int*)(&Q_WS_QWS))[argc];
      |                   ^~~~~~~~
CMakeFiles/cmTC_28b9d.dir/build.make:85: recipe for target 'CMakeFiles/cmTC_28b9d.dir/CheckSymbolExists.cxx.o' failed
make[1]: *** [CMakeFiles/cmTC_28b9d.dir/CheckSymbolExists.cxx.o] Error 1
make[1]: Leaving directory '/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp'
Makefile:141: recipe for target 'cmTC_28b9d/fast' failed
make: *** [cmTC_28b9d/fast] Error 2


File /data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx:
/* */
#include <QtCore/qglobal.h>

int main(int argc, char** argv)
{
  (void)argv;
#ifndef Q_WS_QWS
  return ((int*)(&Q_WS_QWS))[argc];
#else
  (void)argc;
  return 0;
#endif
}
Determining if the Q_WS_MAC exist failed with the following output:
Change Dir: /data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp

Run Build Command(s):/usr/bin/make cmTC_64c06/fast && /usr/bin/make  -f CMakeFiles/cmTC_64c06.dir/build.make CMakeFiles/cmTC_64c06.dir/build
make[1]: Entering directory '/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp'
Building CXX object CMakeFiles/cmTC_64c06.dir/CheckSymbolExists.cxx.o
/data/ssd/hcli/usr/local/bin/g++   -I/usr/include/qt4  -O3 -fopenmp -O1 -g1    -o CMakeFiles/cmTC_64c06.dir/CheckSymbolExists.cxx.o -c /data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx
/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx: In function ‘int main(int, char**)’:
/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx:8:19: error: ‘Q_WS_MAC’ was not declared in this scope
    8 |   return ((int*)(&Q_WS_MAC))[argc];
      |                   ^~~~~~~~
CMakeFiles/cmTC_64c06.dir/build.make:85: recipe for target 'CMakeFiles/cmTC_64c06.dir/CheckSymbolExists.cxx.o' failed
make[1]: *** [CMakeFiles/cmTC_64c06.dir/CheckSymbolExists.cxx.o] Error 1
make[1]: Leaving directory '/data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp'
Makefile:141: recipe for target 'cmTC_64c06/fast' failed
make: *** [cmTC_64c06/fast] Error 2


File /data/ssd/qluo/AMF-Placer-ICCAD-2021/build/CMakeFiles/CMakeTmp/CheckSymbolExists.cxx:
/* */
#include <QtCore/qglobal.h>

int main(int argc, char** argv)
{
  (void)argv;
#ifndef Q_WS_MAC
  return ((int*)(&Q_WS_MAC))[argc];
#else
  (void)argc;
  return 0;
#endif
}

I have checked that we have already installed Qt 4 and Qt 5. And I do not know how to solve this problem. Could you help me to see why it would happen and how to deal with it.

Thanks,
Qin

Extension to other Xilinx FPGA device

Hi. I'm now working on a project and want to extend AMF-Placer to another FPGA device (namely, ZCU104), I'm wondering where should I get the device layout of ZCU104(or other device) such that I can modify the parser and extract the device location?
Thanks a lot!

Legalization bugs when cells in a macro are placed across clock region

INFO: [DRC 23-27] Running DRC with 8 threads
ERROR: [DRC CASC-31] Cascade crosses rbrk: The RAMB36E2 cell design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_11 is cascaded in series to expand the RAMB depth, however the cascade connection crosses a Clock Region. The pin design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_11/CASOREGIMUXA is connected to an ACTIVE net (design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_1_i_1_n_6). This causes a potential hold violation on the dedicated cascade paths between the RAMBs that cannot be corrected. This creates an invalid timing situation. Please take steps to ensure placement of the cascaded RAMB remains inside a single Clock Region or else choose a different implementation style for this RAMB in order to prevent the need for cascading across a Clock Region or the use of this pin.
ERROR: [DRC CASC-31] Cascade crosses rbrk: The RAMB36E2 cell design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_11 is cascaded in series to expand the RAMB depth, however the cascade connection crosses a Clock Region. The pin design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_11/CASOREGIMUXEN_A is connected to an ACTIVE net (design_1_i/DigitRec_0/inst/regslice_both_input_V_U/obuf_inst/test_set_V_ce0). This causes a potential hold violation on the dedicated cascade paths between the RAMBs that cannot be corrected. This creates an invalid timing situation. Please take steps to ensure placement of the cascaded RAMB remains inside a single Clock Region or else choose a different implementation style for this RAMB in order to prevent the need for cascading across a Clock Region or the use of this pin.
ERROR: [DRC CASC-31] Cascade crosses rbrk: The RAMB36E2 cell design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_9 is cascaded in series to expand the RAMB depth, however the cascade connection crosses a Clock Region. The pin design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_9/CASOREGIMUXA is connected to an ACTIVE net (design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_1_i_1_n_6). This causes a potential hold violation on the dedicated cascade paths between the RAMBs that cannot be corrected. This creates an invalid timing situation. Please take steps to ensure placement of the cascaded RAMB remains inside a single Clock Region or else choose a different implementation style for this RAMB in order to prevent the need for cascading across a Clock Region or the use of this pin.
ERROR: [DRC CASC-31] Cascade crosses rbrk: The RAMB36E2 cell design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_9 is cascaded in series to expand the RAMB depth, however the cascade connection crosses a Clock Region. The pin design_1_i/DigitRec_0/inst/test_set_V_U/DigitRec_test_set_V_ram_U/ram_reg_bram_9/CASOREGIMUXEN_A is connected to an ACTIVE net (design_1_i/DigitRec_0/inst/regslice_both_input_V_U/obuf_inst/test_set_V_ce0). This causes a potential hold violation on the dedicated cascade paths between the RAMBs that cannot be corrected. This creates an invalid timing situation. Please take steps to ensure placement of the cascaded RAMB remains inside a single Clock Region or else choose a different implementation style for this RAMB in order to prevent the need for cascading across a Clock Region or the use of this pin.
INFO: [Vivado_Tcl 4-198] DRC finished with 4 Errors
INFO: [Vivado_Tcl 4-199] Please refer to the DRC report (report_drc) for more information.
ERROR: [Vivado_Tcl 4-23] Error(s) found during DRC. Placer not run.
INFO: [Common 17-83] Releasing license: Implementation
9 Infos, 0 Warnings, 0 Critical Warnings and 5 Errors encountered.
place_design failed
place_design: Time (s): cpu = 00:00:33 ; elapsed = 00:00:16 . Memory (MB): peak = 12107.438 ; gain = 681.867 ; free physical = 5118 ; free virtual = 26935
ERROR: [Common 17-39] 'place_design' failed due to earlier errors.

while executing

"place_design"
(file "/home/tingyuan/Documents/AMF-Placer/build/dumpData_digitRecognition/DumpCLBPacking-first-0.tcl" line 543053)

SLR/Clock/Congestion-Aware Initial Placement

The initial floorplanning will heavily impact the final placement. The net weights during initial placement are a big problem!

During partitioning, we should consider the interconnection density!

Can i have the original design and device file of the VCU108?

Hi,I am using AMF2.0 to reproduce the experiment about vivado,but i can't find the desigin and device file for vivado to run the flow ,"2_6_LoadtheOutputPlacementinVivado Load the Output Placement in Vivado".So could you please provide the original design and device file like .v or .xpr format ? THANK YOU !!!

Please don't hesitate to contact us if you encounter problems with our AMF-Placer

We received some feedback from the community and we are following up and will release an updated version with comprehensive timing-driven optimization as soon as possible.

Please don't hesitate to contact us (both issue threads and emails are ok) if you encounter problems with our AMF-Placer because sometimes the problems could be our BUG instead of your mistake. If necessary we could release a temporary branch for you to solve the problems. ^_^

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.