| #!/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" |