| #!/bin/bash |
| # Copyright (C) 2017-2020 The Project X-Ray Authors. |
| # |
| # Use of this source code is governed by a ISC-style |
| # license that can be found in the LICENSE file or at |
| # https://opensource.org/licenses/ISC |
| # |
| # SPDX-License-Identifier: ISC |
| |
| # $1: DB type |
| # $2: filename to merge in |
| |
| set -ex |
| test $# = 2 |
| test -e "$2" |
| |
| tmp1=`mktemp -p .` |
| tmp2=`mktemp -p .` |
| LOCKFILE="/tmp/segbits_$1.db.lock" |
| LOCKTIMEOUT=30 # 30s timeout |
| LOCKID=222 |
| |
| function finish { |
| echo "Cleaning up temp files" |
| rm -f "$tmp1" |
| rm -f "$tmp2" |
| } |
| trap finish EXIT |
| |
| db=$XRAY_DATABASE_DIR/$XRAY_DATABASE/segbits_$1.db |
| |
| # if the DB exists acquire a lock |
| if [ -f $db ]; then |
| eval "exec $LOCKID>$LOCKFILE" |
| # the lock is automatically released on script exit |
| flock --timeout $LOCKTIMEOUT $LOCKID |
| if [ ! $? -eq 0 ]; then |
| echo "Timeout while waiting for lock" |
| finish |
| exit 1 |
| fi |
| fi |
| |
| # Check existing DB |
| if [ -f $db ] ; then |
| ${XRAY_PARSEDB} --strict "$db" |
| fi |
| |
| # Check new DB |
| ${XRAY_PARSEDB} --strict "$2" |
| |
| # Fuzzers verify L/R data is equivilent |
| # However, expand back to L/R to make downstream tools not depend on this |
| # in case we later find exceptions |
| |
| ismask=false |
| case "$1" in |
| clbll_l) |
| sed < "$2" > "$tmp1" \ |
| -e 's/^CLB\.SLICE_X0\./CLBLL_L.SLICEL_X0./' \ |
| -e 's/^CLB\.SLICE_X1\./CLBLL_L.SLICEL_X1./' ;; |
| clbll_r) |
| sed < "$2" > "$tmp1" \ |
| -e 's/^CLB\.SLICE_X0\./CLBLL_R.SLICEL_X0./' \ |
| -e 's/^CLB\.SLICE_X1\./CLBLL_R.SLICEL_X1./' ;; |
| clblm_l) |
| sed < "$2" > "$tmp1" \ |
| -e 's/^CLB\.SLICE_X0\./CLBLM_L.SLICEM_X0./' \ |
| -e 's/^CLB\.SLICE_X1\./CLBLM_L.SLICEL_X1./' ;; |
| clblm_r) |
| sed < "$2" > "$tmp1" \ |
| -e 's/^CLB\.SLICE_X0\./CLBLM_R.SLICEM_X0./' \ |
| -e 's/^CLB\.SLICE_X1\./CLBLM_R.SLICEL_X1./' ;; |
| |
| dsp_l) |
| sed < "$2" > "$tmp1" -e 's/^DSP\./DSP_L./' ;; |
| dsp_r) |
| sed < "$2" > "$tmp1" -e 's/^DSP\./DSP_R./' ;; |
| |
| bram_l) |
| sed < "$2" > "$tmp1" -e 's/^BRAM\./BRAM_L./' ;; |
| bram_r) |
| sed < "$2" > "$tmp1" -e 's/^BRAM\./BRAM_R./' ;; |
| |
| bram_l.block_ram) |
| sed < "$2" > "$tmp1" -e 's/^BRAM\./BRAM_L./' ;; |
| bram_r.block_ram) |
| sed < "$2" > "$tmp1" -e 's/^BRAM\./BRAM_R./' ;; |
| |
| int_l) |
| sed < "$2" > "$tmp1" -e 's/^INT\./INT_L./' ;; |
| int_r) |
| sed < "$2" > "$tmp1" -e 's/^INT\./INT_R./' ;; |
| |
| hclk_l) |
| sed < "$2" > "$tmp1" -e 's/^HCLK\./HCLK_L./' ;; |
| hclk_r) |
| sed < "$2" > "$tmp1" -e 's/^HCLK\./HCLK_R./' ;; |
| |
| clk_hrow_bot_r) |
| sed < "$2" > "$tmp1" -e 's/^CLK_HROW\./CLK_HROW_BOT_R./' ;; |
| clk_hrow_top_r) |
| sed < "$2" > "$tmp1" -e 's/^CLK_HROW\./CLK_HROW_TOP_R./' ;; |
| |
| clk_bufg_bot_r) |
| sed < "$2" > "$tmp1" -e 's/^CLK_BUFG\./CLK_BUFG_BOT_R./' ;; |
| clk_bufg_top_r) |
| sed < "$2" > "$tmp1" -e 's/^CLK_BUFG\./CLK_BUFG_TOP_R./' ;; |
| |
| hclk_cmt) |
| cp "$2" "$tmp1" ;; |
| hclk_cmt_l) |
| sed < "$2" > "$tmp1" -e 's/^HCLK_CMT\./HCLK_CMT_L./' ;; |
| |
| clk_bufg_rebuf) |
| cp "$2" "$tmp1" ;; |
| |
| liob33) |
| sed < "$2" > "$tmp1" -e 's/^IOB33\./LIOB33./' ;; |
| |
| riob33) |
| sed < "$2" > "$tmp1" -e 's/^IOB33\./RIOB33./' ;; |
| |
| riob18) |
| sed < "$2" > "$tmp1" -e 's/^IOB18\./RIOB18./' ;; |
| |
| lioi3) |
| sed < "$2" > "$tmp1" -e 's/^IOI3\./LIOI3./' ;; |
| |
| lioi3_tbytesrc) |
| sed < "$2" > "$tmp1" -e 's/^IOI3\./LIOI3_TBYTESRC./' ;; |
| |
| lioi3_tbyteterm) |
| sed < "$2" > "$tmp1" -e 's/^IOI3\./LIOI3_TBYTETERM./' ;; |
| |
| rioi3) |
| sed < "$2" > "$tmp1" -e 's/^IOI3\./RIOI3./' ;; |
| |
| rioi) |
| sed < "$2" > "$tmp1" -e 's/^IOI\./RIOI./' ;; |
| |
| rioi3_tbytesrc) |
| sed < "$2" > "$tmp1" -e 's/^IOI3\./RIOI3_TBYTESRC./' ;; |
| |
| rioi_tbytesrc) |
| sed < "$2" > "$tmp1" -e 's/^IOI\./RIOI_TBYTESRC./' ;; |
| |
| rioi3_tbyteterm) |
| sed < "$2" > "$tmp1" -e 's/^IOI3\./RIOI3_TBYTETERM./' ;; |
| |
| rioi_tbyteterm) |
| sed < "$2" > "$tmp1" -e 's/^IOI\./RIOI_TBYTETERM./' ;; |
| |
| cmt_top_r_upper_t) |
| sed < "$2" > "$tmp1" -e 's/^CMT_UPPER_T\./CMT_TOP_R_UPPER_T./' ;; |
| |
| cmt_top_l_upper_t) |
| sed < "$2" > "$tmp1" -e 's/^CMT_UPPER_T\./CMT_TOP_L_UPPER_T./' ;; |
| |
| cmt_top_r_lower_b) |
| sed < "$2" > "$tmp1" -e 's/^CMT_LOWER_B\./CMT_TOP_R_LOWER_B./' ;; |
| |
| cmt_top_l_lower_b) |
| sed < "$2" > "$tmp1" -e 's/^CMT_LOWER_B\./CMT_TOP_L_LOWER_B./' ;; |
| |
| cfg_center_mid) |
| cp "$2" "$tmp1" ;; |
| |
| hclk_ioi3) |
| cp "$2" "$tmp1" ;; |
| |
| hclk_ioi) |
| cp "$2" "$tmp1" ;; |
| |
| pcie_bot) |
| cp "$2" "$tmp1" ;; |
| |
| pcie_int_interface_l) |
| sed < "$2" > "$tmp1" -e 's/^PCIE_INT_INTERFACE\./PCIE_INT_INTERFACE_L./' ;; |
| |
| pcie_int_interface_r) |
| sed < "$2" > "$tmp1" -e 's/^PCIE_INT_INTERFACE\./PCIE_INT_INTERFACE_R./' ;; |
| |
| gtp_common) |
| cp "$2" "$tmp1" ;; |
| |
| gtp_common_mid_left) |
| sed < "$2" > "$tmp1" -e 's/^GTP_COMMON\./GTP_COMMON_MID_LEFT./' ;; |
| |
| gtp_common_mid_right) |
| sed < "$2" > "$tmp1" -e 's/^GTP_COMMON\./GTP_COMMON_MID_RIGHT./' ;; |
| |
| gtp_channel_0) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_0./' ;; |
| |
| gtp_channel_1) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_1./' ;; |
| |
| gtp_channel_2) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_2./' ;; |
| |
| gtp_channel_3) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_3./' ;; |
| |
| gtp_channel_0_mid_left) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_0_MID_LEFT./' ;; |
| |
| gtp_channel_1_mid_left) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_1_MID_LEFT./' ;; |
| |
| gtp_channel_2_mid_left) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_2_MID_LEFT./' ;; |
| |
| gtp_channel_3_mid_left) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_3_MID_LEFT./' ;; |
| |
| gtp_channel_0_mid_right) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_0_MID_RIGHT./' ;; |
| |
| gtp_channel_1_mid_right) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_1_MID_RIGHT./' ;; |
| |
| gtp_channel_2_mid_right) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_2_MID_RIGHT./' ;; |
| |
| gtp_channel_3_mid_right) |
| sed < "$2" > "$tmp1" -e 's/^GTP_CHANNEL\./GTP_CHANNEL_3_MID_RIGHT./' ;; |
| |
| gtp_int_interface_l) |
| sed < "$2" > "$tmp1" -e 's/^GTP_INT_INTERFACE\.GTPE2_INT/GTP_INT_INTERFACE_L\.GTPE2_INT_LEFT/' ;; |
| |
| gtp_int_interface_r) |
| sed < "$2" > "$tmp1" -e 's/^GTP_INT_INTERFACE\.GTPE2_INT/GTP_INT_INTERFACE_R\.GTPE2_INT_R/' ;; |
| |
| gtp_int_interface) |
| cp "$2" "$tmp1" ;; |
| |
| mask_*) |
| db=$XRAY_DATABASE_DIR/$XRAY_DATABASE/$1.db |
| ismask=true |
| cp "$2" "$tmp1" ;; |
| |
| *) |
| echo "Invalid mode: $1" |
| rm -f "$tmp1" "$tmp2" |
| exit 1 |
| esac |
| |
| touch "$db" |
| if $ismask ; then |
| sort -u "$tmp1" "$db" | grep -v '<.*>' > "$tmp2" || true |
| else |
| # tmp1 must be placed second to take precedence over old bad entries |
| if ! $ismask ; then |
| db_origin=$XRAY_DATABASE_DIR/$XRAY_DATABASE/segbits_$1.origin_info.db |
| if [ ! -f $db_origin ] ; then |
| touch "$db_origin" |
| fi |
| python3 ${XRAY_DIR}/utils/mergedb.py --out "$db_origin" "$db_origin" "$tmp1" --track_origin |
| fi |
| python3 ${XRAY_DIR}/utils/mergedb.py --out "$tmp2" "$db" "$tmp1" |
| fi |
| # Check aggregate db for consistency and make canonical |
| ${XRAY_PARSEDB} --strict "$tmp2" "$db" |