// This file is used for internal testing by the OpenROAD team.
def NEW_SHA = "NONE"
def OLD_SHA = "NONE"
pipeline {
    agent any;
    options {
        timeout(time: 8, unit: 'HOURS');
    }
    environment {
        ROUTING_CORES = 32;
    }
    stages {

        // not used, checkout just to keep track of changes
        stage("Update OpenROAD to HEAD of master branch") {
            steps {
                checkout([$class: "GitSCM",
                        branches: [[name: "*/master"]],
                        userRemoteConfigs: [[url: "https://github.com/The-OpenROAD-Project/OpenROAD"]],
                        extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'openroad']]
                ]);
            }
        }

        stage('Build OpenROAD Docker image with master branch') {
            steps {
                sh 'PDK_ROOT=$(pwd)/pdks OPENLANE_IMAGE_NAME=efabless/openlane python3 .github/scripts/update_tools.py openroad_app';
                sh 'make -C docker build-openroad_app';
                script { NEW_SHA  = sh (returnStdout: true, script: "python3 dependencies/tool.py -f commit openroad_app").trim(); }
            }
        }

        stage('Build Docker OpenLane image with openroad_app master') {
            steps {
                sh 'make -C docker openlane';
                sh 'docker save efabless/openlane:current | gzip > openlane-current.tar.gz';
                stash name: 'data', includes: 'openlane-current.tar.gz';
            }
        }

        stage('Run Tests') {
            matrix {
                axes {
                    axis {
                        name 'DESIGN';
                        values "aes",
                               "aes_core",
                               "APU",
                               "blabla",
                               "BM64",
                               "gcd",
                               "inverter",
                               "manual_macro_placement_test",
                               "picorv32a",
                               "PPU",
                               "s44",
                               "salsa20",
                               "spm",
                               "usb",
                               "usb_cdc_core",
                               "wbqspiflash",
                               "xtea",
                               "y_huff",
                               "zipdiv";
                    }
                }
                stages {
                    stage('Test') {
                        agent any;
                        steps {
                            script {
                                stage("${DESIGN} - Install PDK") {
                                    sh 'python3 -m pip install --user --upgrade --no-cache-dir pip';
                                    sh 'python3 -m pip install --user --upgrade --no-cache-dir volare';
                                    sh 'PDK_ROOT=$(pwd)/pdks ~/.local/bin/volare enable_or_build -t NULL -j$(nproc) $(python3 ./dependencies/tool.py open_pdks -f commit)';
                                }
                                stage("${DESIGN} - Import Docker image") {
                                    unstash "data";
                                    sh 'docker load --input openlane-current.tar.gz';
                                }
                                stage("${DESIGN} - Update OpenROAD commit") {
                                    script { OLD_SHA  = sh (returnStdout: true, script: "python3 dependencies/tool.py -f commit openroad_app").trim(); }
                                    sh "sed -i s/${OLD_SHA}/${NEW_SHA}/ ./dependencies/tool_metadata.yml"
                                }
                                stage("${DESIGN} - Run test") {
                                    sh "make OPENLANE_DOCKER_TAG=current TEST_DESIGN=${DESIGN} test";
                                }
                            }
                        }
                        post {
                            failure {
                                archiveArtifacts artifacts: "designs/**/*.log, designs/**/openroad_issue_reproducible/**/*";
                            }
                        }
                    }
                }
            }
        }

    }

    post {
        failure {
            emailext(
                    to: '$DEFAULT_RECIPIENTS',
                    subject: '$DEFAULT_SUBJECT',
                    body: '$DEFAULT_CONTENT',
                    );
        }
    }

}
